我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。

如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。

另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。

有什么好办法来解决这个问题吗?


当前回答

我记录了如何通过将其转换为.so文件和将其转换为python轮文件来混淆python: https://github.com/UM-NLP/python-obfuscation

其他回答

另一种让代码更难被窃取的方法是使用jython,然后使用java混淆器。

这应该工作得很好,因为jythonc将python代码转换为java,然后将java编译为字节码。因此,如果混淆了类,就很难理解反编译后会发生什么,更不用说恢复实际的代码了。

jython的唯一问题是你不能使用用c编写的python模块。

在某些情况下,可以将软件(全部或至少关键部分)移动到组织托管的web服务中。

这样,许可证检查就可以在您自己的服务器机房的安全环境中执行。

我很惊讶,在任何回答中都没有看到“具体”。也许是因为它比问题更新?

它可能正是你所需要的。

它不会混淆代码,而是在加载时对代码进行加密和解密。

来自pypi页面:

保护python脚本工作流程 Your_script.py导入pyconcrete Pyconcrete将钩子导入模块 当你的脚本导入MODULE, pyconcrete导入钩子将尝试查找MODULE。先撒,再撒 解密模块。Pye via _pyconcrete。Pyd并执行解密的数据(如 .pyc内容) 加密和解密_pyconcrete.pyd中的密钥记录 (如DLL或SO)的秘密密钥将隐藏在二进制代码,不能 直接在HEX视图中看到它

如果我们关注软件许可,我建议看看我在这里写的另一个Stack Overflow答案,以获得如何构建许可密钥验证系统的灵感。

GitHub上有一个开源库,可以帮助您进行许可证验证。

你可以通过pip安装许可来安装它,然后添加以下代码:

pubKey = "<RSAKeyValue><Modulus>sGbvxwdlDbqFXOMlVUnAF5ew0t0WpPW7rFpI5jHQOFkht/326dvh7t74RYeMpjy357NljouhpTLA3a6idnn4j6c3jmPWBkjZndGsPL4Bqm+fwE48nKpGPjkj4q/yzT4tHXBTyvaBjA8bVoCTnu+LiC4XEaLZRThGzIn5KQXKCigg6tQRy0GXE13XYFVz/x1mjFbT9/7dS8p85n8BuwlY5JvuBIQkKhuCNFfrUxBWyu87CFnXWjIupCD2VO/GbxaCvzrRjLZjAngLCMtZbYBALksqGPgTUN7ZM24XbPWyLtKPaXF2i4XRR9u6eTj5BfnLbKAU5PIVfjIS+vNYYogteQ==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"

res = Key.activate(token="WyIyNTU1IiwiRjdZZTB4RmtuTVcrQlNqcSszbmFMMHB3aWFJTlBsWW1Mbm9raVFyRyJd",\
                   rsa_pub_key=pubKey,\
                   product_id=3349, key="ICVLD-VVSZR-ZTICT-YKGXL", machine_code=Helpers.GetMachineCode())

if res[0] == None not Helpers.IsOnRightMachine(res[0]):
    print("An error occured: {0}".format(res[1]))
else:
    print("Success")

你可以在这里阅读更多关于RSA公钥等配置方式的信息。

我理解您希望客户使用python的强大功能,但又不想公开源代码。

以下是我的建议:

(a)以C或c++库的形式编写代码的关键部分,然后使用SIP或swig将C/ c++ api公开给Python名称空间。

(b)使用cython而不是Python

(c)在(a)和(b)中,应该可以将库作为带有Python接口的许可二进制文件分发。