我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
使用cxfreeze (Linux的py2exe)可以完成这项工作。
http://cx-freeze.sourceforge.net/
它可以在ubuntu存储库中找到
其他回答
Python是一种字节码编译的解释型语言,很难被锁定。即使您使用py2exe这样的exe-packager,可执行文件的布局也是众所周知的,Python字节码也很好理解。
通常在这种情况下,你必须做出权衡。保护代码到底有多重要?里面有真正的秘密吗(比如对称加密银行转账的密钥),还是你只是多疑了?选择能让你最快开发出最好产品的语言,并现实地看待你的新想法的价值。
如果您决定确实需要安全地执行许可检查,可以将其编写为一个小的C扩展,这样许可证检查代码就很难(但不是不可能!)进行反向工程,并将大部分代码留在Python中。
使用Python所能做的最好的事情就是模糊一些东西。
剥离所有文档字符串 只分发.pyc编译文件。 冻结它 隐藏类/模块中的常量,这样help(config)就不会显示所有内容
您可以通过加密部分数据并动态解密并将其传递给eval()来增加一些额外的模糊性。但无论你做什么,总会有人打破它。
这些都不能阻止一个坚定的攻击者通过help、dir等方法来分解字节码或挖掘你的api。
另一种让代码更难被窃取的方法是使用jython,然后使用java混淆器。
这应该工作得很好,因为jythonc将python代码转换为java,然后将java编译为字节码。因此,如果混淆了类,就很难理解反编译后会发生什么,更不用说恢复实际的代码了。
jython的唯一问题是你不能使用用c编写的python模块。
我理解您希望客户使用python的强大功能,但又不想公开源代码。
以下是我的建议:
(a)以C或c++库的形式编写代码的关键部分,然后使用SIP或swig将C/ c++ api公开给Python名称空间。
(b)使用cython而不是Python
(c)在(a)和(b)中,应该可以将库作为带有Python接口的许可二进制文件分发。
保护代码的唯一可靠方法是在您控制的服务器上运行它,并为您的客户机提供与该服务器接口的客户机。