如何保护我的Python程序
我想做的是保护我的Python程序,防止那些没有计算机知识的人盗用。我知道程序被盗用是不可避免的,我只想保护它不被普通用户随便使用。
我想到了两个主意:
- 设置时间限制,通过在线检查日期和时间来实现。比如说,从下载时间起10天后就不能用了。
- 检查下载程序的电脑的IP地址或名称,让程序只能在那台电脑上运行。(这样可以防止朋友们随便分享文件)。
这两个方法的问题是,我需要“即时”创建一个.py文件,然后用像pytoexe这样的工具把它变成.exe文件,这样用户就不需要安装Python了。
第二个方法的问题是,我了解到IP地址是会变化的,而获取电脑名称可能会有安全风险,可能会让用户感到不安。
所以总结一下,我有两个问题:
- 有没有好的方法可以让程序只在那台电脑上运行?
- 创建.exe文件的最佳方法是什么?(我打算把网站放在我的电脑上,并学习php和服务器相关的知识)。
我有中等的C/C++经验,还有一些基本的HTML/CSS、Java和Python的知识。
谢谢你的时间!
4 个回答
为了避免程序在运行时需要连接互联网,你可以用以下方法来“加锁”你的程序:
- 找出程序中一个重要的部分(没有这个部分,其他的功能就没用了),
- 把这个部分放进一个字符串里,
- 用运行这个程序的电脑的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地址;大多数网卡都支持这个功能。
- 要么修改
所以这并不是一个“安全”的解决方案。
但是如果一个对电脑知识了解不多的人把你的代码给了其他人,而没有提供更多的信息(比如把它放到论坛上),接收者就无法直接运行它。
最后我想指出,把代码绑定到特定电脑上可能会给合法用户带来麻烦。如果我在用一个程序,结果因为换了硬件(可能只是因为我换了新笔记本)就不能用了,我通常会很生气,还会抱怨这个代码的作者。你可能不想让你的客户感到烦恼。
这事儿有点复杂。你可能已经明白,编译和加密是两回事。
不过,如果你的老板觉得用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
给每个用户一个定制的 安装程序,里面有一个独特的密钥。当这个安装程序运行时,它会联系一个服务器(带着这个密钥),请求下载实际的程序。在服务器那边,你需要检查这个密钥是否有效,如果有效,就把带有这个密钥的定制程序发给用户,并把这个密钥标记为已使用。安装程序会把程序保存到用户可以访问的地方,并在电脑的某个深处创建一个隐藏文件,里面存放着这个密钥,这样“普通用户”就不会想到去找。
当程序运行时,它首先会检查这个隐藏文件是否存在,以及里面是否包含正确的密钥,如果没有,就拒绝运行。
(我假设解压一个可执行文件和读取源代码的能力超出了“普通用户”的能力范围(比如“奶奶”),所以使用 py2exe 是可以的。)