如何保护 Python 代码不被用户阅读?
- 2024-11-25 08:50:00
- admin 原创
- 177
问题描述:
我正在用 Python 开发一款软件,将分发给我雇主的客户。我的雇主想使用有时间限制的许可证文件来限制该软件的使用。
如果我们分发.py
文件甚至.pyc
文件,将很容易(反编译并)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户阅读代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有没有什么好办法可以解决这个问题?
解决方案 1:
“有没有什么好办法可以解决这个问题?” 没有。没有任何东西可以防止逆向工程。甚至 DVD 机器上的固件也已被逆向工程,AACS 加密密钥也被泄露。尽管 DMCA 将此定为刑事犯罪,但情况仍然如此。
由于没有任何技术方法可以阻止您的客户阅读您的代码,因此您必须应用普通的商业方法。
许可证。合同。条款和条件。即使人们可以阅读代码,这仍然有效。请注意,某些基于 Python 的组件可能要求您在使用这些组件销售软件之前支付费用。此外,某些开源许可证禁止您隐瞒该组件的来源或出处。
提供有价值的东西。如果你的产品如此优秀——而且价格难以拒绝——那么就没有动力浪费时间和金钱进行逆向工程。逆向工程成本高昂。让你的产品稍微便宜一点。
提供升级和增强功能,让任何逆向工程都成为坏主意。当下一个版本破坏了他们的逆向工程时,就没有意义了。这可能会走向荒谬的极端,但你应该提供新功能,让下一个版本比逆向工程更有价值。
以极具吸引力的价格提供定制服务,这样他们就宁愿付钱给你来构建和支持这些增强功能。
使用过期的许可证密钥。这很残忍,会给你带来坏名声,但它肯定会让你的软件停止工作。
将其作为 Web 服务提供。SaaS 不需要客户下载。
解决方案 2:
Python 是一种字节码编译解释型语言,很难锁定。即使你使用像py2exe这样的 exe 打包程序,可执行文件的布局也是众所周知的,而且 Python 字节码也很容易理解。
通常在这种情况下,你必须做出权衡。保护代码真的有多重要?代码中真的有秘密吗(比如银行转账的对称加密密钥),还是你只是有点偏执?选择能让你以最快的速度开发出最佳产品的语言,并切实认识到你的新奇想法有多有价值。
如果您决定确实需要安全地执行许可证检查,请将其写为一个小的 C 扩展,以便许可证检查代码可以非常困难(但并非不可能!)进行逆向工程,并将大部分代码留在 Python 中。
解决方案 3:
Python 不是你需要的工具
你必须使用正确的工具来做正确的事情,而 Python 的设计初衷并不是模糊的。恰恰相反,在 Python 中一切都是开放的,或者说一切都很容易揭示或修改,因为这是该语言的哲学。
如果你想要一些你看不透的东西,那就找另一个工具。这不是坏事,重要的是有几种不同的工具用于不同的用途。
混淆确实很难
即使是编译后的程序也可以进行逆向工程,所以不要以为你可以完全保护任何代码。你可以分析混淆的 PHP、破解闪存加密密钥等。新版本的 Windows 每次都会被破解。
有法律要求是好办法
你无法阻止别人滥用你的代码,但你可以轻易发现是否有人滥用。因此,这只是一个普通的法律问题。
代码保护被高估了
如今,商业模式倾向于销售服务而不是产品。你不能复制、盗版或窃取服务。也许是时候考虑顺其自然了……
解决方案 4:
编译 python 并分发二进制文件!
明智的想法:
使用Cython、Nuitka、Shed Skin或类似程序将 Python 编译为 C 代码,然后将您的应用程序作为 Python 二进制库(pyd)分发。
这样,就不会剩下任何 Python(字节)代码,而且我认为你已经完成了任何人(即你的雇主)都可以从常规代码中期望的合理程度的模糊化。(.NET 或 Java 的安全性不如这种情况,因为该字节码没有被混淆,并且可以相对容易地反编译为合理的源代码。)
Cython 与 CPython 的兼容性越来越好,所以我认为它应该可以工作。(我实际上正在为我们的产品考虑这一点。我们已经将一些第三方库构建为 pyd/dll,因此将我们自己的 python 代码作为二进制文件发送对我们来说并不是一个太大的进步。)
请参阅此博客文章(不是我写的)以获取有关如何操作的教程。(感谢@hithwen)
疯狂的想法:
您可能可以让 Cython 为每个模块单独存储 C 文件,然后将它们全部连接起来,并使用大量内联构建它们。这样,您的 Python 模块就非常庞大,很难用常用工具进行拆分。
疯狂至极:
如果您可以静态链接(并优化)python 运行时和所有库 (dll),您可能能够构建单个可执行文件。这样,拦截对 python 和您使用的任何框架库的调用肯定很困难。但是,如果您使用 LGPL 代码,则无法做到这一点。
解决方案 5:
我明白您希望您的客户使用 Python 的强大功能,但又不想公开源代码。
以下是我的建议:
(a) 将代码的关键部分写为 C 或 C++ 库,然后使用SIP或swig将 C/C++ API 公开给 Python 命名空间。
(b)使用cython代替 Python
(c)在(a)和(b)中,都应该能够将库作为带有 Python 接口的许可二进制文件进行分发。
解决方案 6:
你看过pyminifier吗?它可以缩小、混淆和压缩 Python 代码。示例代码对于随意的逆向工程来说看起来相当糟糕。
$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3