如何保护我的Python程序

0 投票
4 回答
3377 浏览
提问于 2025-04-17 17:33

我想做的是保护我的Python程序,防止那些没有计算机知识的人盗用。我知道程序被盗用是不可避免的,我只想保护它不被普通用户随便使用。

我想到了两个主意:

  1. 设置时间限制,通过在线检查日期和时间来实现。比如说,从下载时间起10天后就不能用了。
  2. 检查下载程序的电脑的IP地址或名称,让程序只能在那台电脑上运行。(这样可以防止朋友们随便分享文件)。

这两个方法的问题是,我需要“即时”创建一个.py文件,然后用像pytoexe这样的工具把它变成.exe文件,这样用户就不需要安装Python了。

第二个方法的问题是,我了解到IP地址是会变化的,而获取电脑名称可能会有安全风险,可能会让用户感到不安。

所以总结一下,我有两个问题:

  1. 有没有好的方法可以让程序只在那台电脑上运行?
  2. 创建.exe文件的最佳方法是什么?(我打算把网站放在我的电脑上,并学习php和服务器相关的知识)。

我有中等的C/C++经验,还有一些基本的HTML/CSS、Java和Python的知识。

谢谢你的时间!

4 个回答

0

为了避免程序在运行时需要连接互联网,你可以用以下方法来“加锁”你的程序:

  • 找出程序中一个重要的部分(没有这个部分,其他的功能就没用了),
  • 把这个部分放进一个字符串里,
  • 用运行这个程序的电脑的MAC地址对这个字符串进行对称加密,
  • 然后在你的程序里这样做:
    • 用当前机器的MAC地址解密这个字符串,
    • 然后用exec来调用解密后的字符串。

举个例子,假设这个重要部分是print "hello world"

def getMyMac():
  return 123456789L  # for testing now
  return uuid.getnode()  # this would be the real thing

def strxor(s, key):
  key *= len(s) / len(key) + 1
  return ''.join(chr(ord(key[i]) ^ ord(s[i])) for i in range(len(s)))

def performVitalCode():
  code = 'A@ZZA\x16\x15P\\]^\\\x14BYET]\x13'
  # I found that code by entering:
  # strxor('print "hello world"', str(getMyMac()))
  realCode = strxor(code, str(getMyMac()))
  exec realCode
  • 在这里我用了一种简单的异或运算来加密字符串(这其实不算很难破解的加密方式)。
  • 当然,使用“允许”的电脑的用户可以把自己的MAC地址给下一个用户,这样下一个用户就可以
    • 要么修改getMyMac(),要么
    • 伪装自己的MAC地址;大多数网卡都支持这个功能。

所以这并不是一个“安全”的解决方案。

但是如果一个对电脑知识了解不多的人把你的代码给了其他人,而没有提供更多的信息(比如把它放到论坛上),接收者就无法直接运行它。

最后我想指出,把代码绑定到特定电脑上可能会给合法用户带来麻烦。如果我在用一个程序,结果因为换了硬件(可能只是因为我换了新笔记本)就不能用了,我通常会很生气,还会抱怨这个代码的作者。你可能不想让你的客户感到烦恼。

5

这事儿有点复杂。你可能已经明白,编译加密是两回事。

不过,如果你的老板觉得用C语言编译的代码就可以接受,你可以使用cython把你的Python代码编译成C语言代码,然后再用gcc来编译这些C语言代码。

你可以在这里查看如何构建你的setup.py脚本。

http://docs.cython.org/src/reference/compilation.html#compiling-with-distutils

而且你可以使用--embed选项把Python嵌入到生成的C代码中:

# will generate the target.c 
$ cython target.py --embed
1

给每个用户一个定制的 安装程序,里面有一个独特的密钥。当这个安装程序运行时,它会联系一个服务器(带着这个密钥),请求下载实际的程序。在服务器那边,你需要检查这个密钥是否有效,如果有效,就把带有这个密钥的定制程序发给用户,并把这个密钥标记为已使用。安装程序会把程序保存到用户可以访问的地方,并在电脑的某个深处创建一个隐藏文件,里面存放着这个密钥,这样“普通用户”就不会想到去找。

当程序运行时,它首先会检查这个隐藏文件是否存在,以及里面是否包含正确的密钥,如果没有,就拒绝运行。

(我假设解压一个可执行文件和读取源代码的能力超出了“普通用户”的能力范围(比如“奶奶”),所以使用 py2exe 是可以的。)

撰写回答