如何保护Python代码不被用户读取?

我正在使用Python编写一款将分发给我雇主的客户的软件。我的雇主希望通过时间限制的许可文件来限制软件的使用。

如果我们分发.py文件,甚至是.pyc文件,那么用户将很容易(反编译并)移除检查许可文件的代码。

另一个问题是,我的雇主不希望我们的客户阅读代码,因为担心代码可能会被窃取,或者至少担心"新创意"会被窃取。

有没有一个好的方法来解决这个问题?

在Python中,作为一种字节码编译的解释型语言,非常难以锁定。即使您使用像py2exe这样的exe打包工具,可执行文件的结构是众所周知的,Python字节码也是众所周知的。

通常在这种情况下,您需要做出权衡。保护代码真的很重要吗?其中是否包含了真正的机密信息(如用于对称加密的银行转账密钥),或者您只是过于担心?选择最能让您快速开发最棒产品的语言,对您的新创意的价值保持现实的认识。

如果您确实决定有必要安全地执行许可检查,可以将其编写为小型C扩展,以使许可检查代码变得非常困难(但并非不可能!)逆向工程,并将大部分代码留在Python中。

参考答案:

您应该看一下getdropbox.com的客户端软件以及Linux上的处理方式。这种方式相当棘手,需要进行一些相当创造性的反汇编才能绕过保护机制。

您的雇主是否知道他可以从其他人从您的代码中得到的任何想法中"窃取"回来?我的意思是,如果他们可以阅读您的工作,那么您也可以阅读他们的工作。也许考虑如何从这种情况中受益会比担心可能损失多,获得更高的投资回报。

(编辑) 回答Nick的评论:

你什么也没得也没失。客户拥有自己想要的东西(并付费购买),因为他改变了软件本身。由于他不发布更改,对其他人来说就好像没有发生过一样。

现在,如果客户销售此软件,则必须更改版权声明(这是非法的,因此您可以提起诉讼并获胜-简单的情况)。

如果他们不更改版权声明,第二级客户将注意到软件来自您的原始软件,并想知道发生了什么。很可能他们会与您联系,这样您就会了解对您的工作进行再销售的情况。

同样,我们有两种情况:原始客户只销售了几份副本。这意味着他们没有赚到太多钱,所以为什么费心呢?或者他们大份额销售。这意味着您更有机会了解他们在做什么并采取行动。

但是最后,大多数公司都努力遵守法律(一旦他们的声誉受到损害,他们要做生意就更加困难)。因此,他们不会窃取您的工作,而是与您合作改进它。因此,如果您包含了源代码(附带可保护您免受简单再销售的许可证),那么他们只会推迟他们所做的更改,这样可以确保更改在下一个版本中,而且他们不必自己维护它。这是双赢:您可以获得更改,而他们可以在您不愿意将更改包括在正式版本中时自己制作更改。

我在寻找保护自己项目的软件保护方案时发现通用的哲学是完全保护是不可能的。您唯一能希望实现的目标是增加保护的成本,以使用户绕过保护的成本高于购买另一个许可证的成本。

说到这一点,我刚刚在为我的项目应用程序自我保护技术的Google上进行了检查,发现的任何技术都看不到任何东西。在.NET解决方案中,混淆是对Windows平台上您的问题的第一个方法,但我不确定是否有任何可以与Mono一起使用的适用于Linux的解决方案。

下一个是编写您的代码时使用编译语言,或者如果您真的想走到底,那么使用汇编语言。裁剪掉的可执行文件的反编译要困难得多,而解释性语言要简单得多。

这一切归结到权衡。一方面,您可以使用Python轻松进行软件开发,但是很难隐藏秘密。另一方面,您可以使用汇编语言编写软件,这样就可以更好地隐藏秘密,但编写起来会困难得多。

您的老板必须选择一个在这个连续体中某个点,以支持他的要求。然后,他必须为您提供工具和时间,以便您可以构建出他所需要的内容。不过,我的赌注是,他会对实际开发成本与可能损失的货币之间进行比较。

根据CythonNuitka构建的解决方案,实际上并非完美,因为当使用NuitkaCython编译的解决方案运行为.pyd.exe文件时,会生成一个缓存目录,并且所有的.pyc文件都会被复制到缓存目录中,因此,攻击者只需要将.pyc文件反编译并查看或修改您的代码。


相关文章推荐