我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
编译python并分发二进制文件!
明智的想法:
使用Cython, Nuitka, Shed Skin或类似的工具将python编译成C代码,然后将应用程序作为python二进制库(pyd)分发。
这样,就不会留下任何Python(字节)代码,我认为你已经做了任何人(即你的雇主)可以从常规代码中期望的任何合理数量的模糊。(.NET或Java比这种情况更不安全,因为字节码没有混淆,可以相对容易地反编译成合理的源代码。)
Cython与CPython的兼容性越来越好,所以我认为它应该可以工作。(实际上,我正在考虑把这个应用到我们的产品上。我们已经以pyd/dll的形式构建了一些第三方库,所以以二进制文件的形式发布我们自己的python代码对我们来说并不是太大的一步。)
看看这篇博客文章(不是我写的),关于如何做到这一点的教程。(thx @hithwen)
疯狂的想法:
您可能可以让Cython为每个模块分别存储c文件,然后将它们全部连接起来,并使用大量内联来构建它们。这样一来,你的Python模块就变得非常单一,很难用普通工具来解决。
超越疯狂:
如果你可以静态地链接(并优化)python运行时和所有库(dll),你就可以构建一个单独的可执行文件。这样,就很难拦截对python和你所使用的任何框架库的调用。但是,如果您使用的是LGPL代码,则无法做到这一点。
其他回答
发布.pyc文件有它的问题-它们与创建它们时使用的python版本以外的任何其他python版本都不兼容,这意味着您必须知道产品将运行的系统上运行的python版本。这是一个非常有限的因素。
你的雇主是否意识到他可以“偷”回其他人从你的代码中得到的任何想法?如果他们能读懂你的作品,你也能读懂他们的。也许看看你如何能从这种情况中受益,会比担心你可能会失去多少,获得更好的投资回报。
[编辑]回答尼克的评论:
没有得到也没有失去。客户得到了他想要的东西(因为他自己进行了更改,所以已经为此付费了)。因为他没有发布变更,就好像它没有发生在其他人身上一样。
现在如果客户出售软件,他们必须更改版权声明(这是非法的,所以你可以起诉并且会赢->简单的案件)。
如果他们不更改版权声明,第二级客户就会注意到软件来自您的原创,并想知道发生了什么。很有可能他们会联系你,这样你就会了解到你的作品被转售的情况。
同样,我们有两种情况:原来的客户只卖了几份。这意味着他们并没有赚到多少钱,所以为什么要麻烦呢。或者是销量。这意味着你有更好的机会了解他们的工作,并为此做些什么。
But in the end, most companies try to comply to the law (once their reputation is ruined, it's much harder to do business). So they will not steal your work but work with you to improve it. So if you include the source (with a license that protects you from simple reselling), chances are that they will simply push back changes they made since that will make sure the change is in the next version and they don't have to maintain it. That's win-win: You get changes and they can make the change themselves if they really, desperately need it even if you're unwilling to include it in the official release.
使用cxfreeze (Linux的py2exe)可以完成这项工作。
http://cx-freeze.sourceforge.net/
它可以在ubuntu存储库中找到
我记录了如何通过将其转换为.so文件和将其转换为python轮文件来混淆python: https://github.com/UM-NLP/python-obfuscation
我很惊讶,在任何回答中都没有看到“具体”。也许是因为它比问题更新?
它可能正是你所需要的。
它不会混淆代码,而是在加载时对代码进行加密和解密。
来自pypi页面:
保护python脚本工作流程 Your_script.py导入pyconcrete Pyconcrete将钩子导入模块 当你的脚本导入MODULE, pyconcrete导入钩子将尝试查找MODULE。先撒,再撒 解密模块。Pye via _pyconcrete。Pyd并执行解密的数据(如 .pyc内容) 加密和解密_pyconcrete.pyd中的密钥记录 (如DLL或SO)的秘密密钥将隐藏在二进制代码,不能 直接在HEX视图中看到它