我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
在我自己的项目中,我对软件保护进行了一般的研究,总的观点是完全的保护是不可能的。您唯一希望实现的事情是将保护添加到一个级别,使您的客户绕过该级别的成本高于购买另一个许可证的成本。
话虽如此,我只是检查谷歌的python混淆,没有发现很多东西。在. net解决方案中,混淆将是在windows平台上解决问题的第一种方法,但我不确定是否有人在Linux上有与Mono一起工作的解决方案。
接下来要做的就是用编译语言写代码,如果你真的想这么做,那就用汇编语言。一个被剥离的可执行文件将比解释语言更难反编译。
这一切都归结于权衡。一方面,你可以用python轻松地进行软件开发,在python中也很难隐藏秘密。另一方面,你用汇编程序编写的软件更难编写,但更容易隐藏秘密。
你的老板必须在这个连续统一体中选择一个点来支持他的要求。然后他必须给你工具和时间,这样你才能建造他想要的东西。然而,我敢打赌,他会反对实际开发成本与潜在货币损失之间的对立。
其他回答
无论是Cython还是Nuitka都不是答案,因为当运行用Nuitka或Cython编译成.pyd或.exe文件的解决方案时,会生成一个缓存目录,所有的.pyc文件都会复制到缓存目录中,因此攻击者可以简单地反编译.pyc文件并查看您的代码或更改它。
另一种让代码更难被窃取的方法是使用jython,然后使用java混淆器。
这应该工作得很好,因为jythonc将python代码转换为java,然后将java编译为字节码。因此,如果混淆了类,就很难理解反编译后会发生什么,更不用说恢复实际的代码了。
jython的唯一问题是你不能使用用c编写的python模块。
在我自己的项目中,我对软件保护进行了一般的研究,总的观点是完全的保护是不可能的。您唯一希望实现的事情是将保护添加到一个级别,使您的客户绕过该级别的成本高于购买另一个许可证的成本。
话虽如此,我只是检查谷歌的python混淆,没有发现很多东西。在. net解决方案中,混淆将是在windows平台上解决问题的第一种方法,但我不确定是否有人在Linux上有与Mono一起工作的解决方案。
接下来要做的就是用编译语言写代码,如果你真的想这么做,那就用汇编语言。一个被剥离的可执行文件将比解释语言更难反编译。
这一切都归结于权衡。一方面,你可以用python轻松地进行软件开发,在python中也很难隐藏秘密。另一方面,你用汇编程序编写的软件更难编写,但更容易隐藏秘密。
你的老板必须在这个连续统一体中选择一个点来支持他的要求。然后他必须给你工具和时间,这样你才能建造他想要的东西。然而,我敢打赌,他会反对实际开发成本与潜在货币损失之间的对立。
虽然没有完美的解决方案,但可以做到以下几点:
将一些关键的启动代码移到本地库中。 在本机库中执行许可证检查。
如果要删除对本机代码的调用,程序无论如何都不会启动。如果它没有被删除,那么许可证将被强制执行。
虽然这不是一个跨平台的或纯python的解决方案,但它可以工作。
我理解您希望客户使用python的强大功能,但又不想公开源代码。
以下是我的建议:
(a)以C或c++库的形式编写代码的关键部分,然后使用SIP或swig将C/ c++ api公开给Python名称空间。
(b)使用cython而不是Python
(c)在(a)和(b)中,应该可以将库作为带有Python接口的许可二进制文件分发。