我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
“有没有解决这个问题的好办法?”不。没有什么可以防止逆向工程。甚至DVD机器上的固件也被逆向工程,AACS加密密钥被暴露。这还是不顾DMCA规定的刑事犯罪。
由于没有任何技术方法可以阻止客户阅读您的代码,所以您必须应用普通的商业方法。
Licenses. Contracts. Terms and Conditions. This still works even when people can read the code. Note that some of your Python-based components may require that you pay fees before you sell software using those components. Also, some open-source licenses prohibit you from concealing the source or origins of that component. Offer significant value. If your stuff is so good -- at a price that is hard to refuse -- there's no incentive to waste time and money reverse engineering anything. Reverse engineering is expensive. Make your product slightly less expensive. Offer upgrades and enhancements that make any reverse engineering a bad idea. When the next release breaks their reverse engineering, there's no point. This can be carried to absurd extremes, but you should offer new features that make the next release more valuable than reverse engineering. Offer customization at rates so attractive that they'd rather pay you to build and support the enhancements. Use a license key which expires. This is cruel, and will give you a bad reputation, but it certainly makes your software stop working. Offer it as a web service. SaaS involves no downloads to customers.
其他回答
另一种让代码更难被窃取的方法是使用jython,然后使用java混淆器。
这应该工作得很好,因为jythonc将python代码转换为java,然后将java编译为字节码。因此,如果混淆了类,就很难理解反编译后会发生什么,更不用说恢复实际的代码了。
jython的唯一问题是你不能使用用c编写的python模块。
在某些情况下,可以将软件(全部或至少关键部分)移动到组织托管的web服务中。
这样,许可证检查就可以在您自己的服务器机房的安全环境中执行。
Python是一种字节码编译的解释型语言,很难被锁定。即使您使用py2exe这样的exe-packager,可执行文件的布局也是众所周知的,Python字节码也很好理解。
通常在这种情况下,你必须做出权衡。保护代码到底有多重要?里面有真正的秘密吗(比如对称加密银行转账的密钥),还是你只是多疑了?选择能让你最快开发出最好产品的语言,并现实地看待你的新想法的价值。
如果您决定确实需要安全地执行许可检查,可以将其编写为一个小的C扩展,这样许可证检查代码就很难(但不是不可能!)进行反向工程,并将大部分代码留在Python中。
我认为还有一种方法可以保护你的Python代码;模糊处理方法的一部分。我相信有一个像Mount and Blade之类的游戏,改变并重新编译了他们自己的python解释器(原始的解释器,我相信是开源的),只是改变了OP代码表中的OP代码,使其与标准的python OP代码不同。
所以python源代码没有被修改,但是文件扩展名*。Pyc文件是不同的,并且操作代码与公共python.exe解释器不匹配。如果你检查游戏数据文件,所有数据都是Python源格式。
通过这种方式,可以用各种肮脏的伎俩来对付不成熟的黑客。阻止一群没有经验的黑客很容易。你不太可能打败专业黑客。但我想大多数公司不会长期雇佣专业黑客(可能是因为东西被黑客攻击了)。但不成熟的黑客到处都是(可以理解为好奇的IT人员)。
例如,你可以在一个修改过的解释器中,允许它检查源代码中的某些注释或文档字符串。对于这样的代码行,可以使用特殊的OP代码。例如:
OP 234是源行“#版权是我写的” 或者将这一行编译成等同于"if False:" if "# Copyright"缺失的操作代码。基本上是为了一些模糊的原因禁用了一整块代码。
重新编译修改后的解释器可能可行的一个用例是,应用程序不是你写的,应用程序很大,但你有偿保护它,比如当你是一个金融应用程序的专用服务器管理员时。
我发现让源代码或操作码开放以吸引眼球有点矛盾,但对网络通信使用SSL。SSL也不是100%安全。但它被用来阻止大多数眼睛阅读它。采取一点预防措施是明智的。
此外,如果有足够多的人认为Python源代码和操作码太明显了,很可能最终会有人为它开发至少一个简单的保护工具。因此,越来越多的人问“如何保护Python应用程序”只会促进这种发展。
我很惊讶,在任何回答中都没有看到“具体”。也许是因为它比问题更新?
它可能正是你所需要的。
它不会混淆代码,而是在加载时对代码进行加密和解密。
来自pypi页面:
保护python脚本工作流程 Your_script.py导入pyconcrete Pyconcrete将钩子导入模块 当你的脚本导入MODULE, pyconcrete导入钩子将尝试查找MODULE。先撒,再撒 解密模块。Pye via _pyconcrete。Pyd并执行解密的数据(如 .pyc内容) 加密和解密_pyconcrete.pyd中的密钥记录 (如DLL或SO)的秘密密钥将隐藏在二进制代码,不能 直接在HEX视图中看到它