我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
通过散列和签署重要文件并使用公钥方法检查,用标准加密方案为代码签名如何?
通过这种方式,您可以为每个客户颁发带有公钥的license文件。
另外,你可以使用python混淆器,就像这个(谷歌一下)。
其他回答
如果我们关注软件许可,我建议看看我在这里写的另一个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不是你需要的工具
您必须使用正确的工具来做正确的事情,而Python不是为混淆而设计的。事实恰恰相反;在Python中,任何东西都是开放的、易于显示或修改的,因为这是该语言的哲学。
如果你想要一些你看不透的东西,找另一个工具。这并不是一件坏事,重要的是为不同的用途存在不同的工具。
混淆真的很难
即使编译过的程序也可以被逆向工程,所以不要认为你可以完全保护任何代码。你可以分析模糊的PHP,破解flash加密密钥等等。新版本的Windows系统每次都被破解。
有一个法律要求是一个很好的方法
你不能阻止别人滥用你的代码,但是如果有人这样做了,你可以很容易地发现。因此,这只是一个偶然的法律问题。
代码保护被高估了
如今,商业模式倾向于销售服务,而不是产品。你不能复制服务,盗版或窃取它。也许是时候考虑顺其自然了……
你应该看看getdropbox.com的人是如何为他们的客户端软件(包括Linux)做这件事的。这是相当棘手的破解,需要一些相当有创意的拆卸来通过保护机制。
有时间限制许可证的想法,并检查它在本地安装的程序将不会工作。即使有完美的混淆,许可证检查也可以被删除。但是,如果您在远程系统上检查许可证,并在关闭的远程系统上运行程序的重要部分,您将能够保护您的IP。
防止竞争对手将源代码作为自己的或编写相同代码的灵感版本,一种保护方法是在您的程序逻辑中添加签名(可以证明代码是从您那里窃取的一些秘密),并混淆python源代码,使其难以阅读和利用。
好的混淆添加了基本相同的保护,你的代码,编译为可执行的(和剥离二进制)。弄清楚模糊的复杂代码是如何工作的可能比实际编写自己的实现还要困难。
这将无助于防止您的程序被黑客攻击。即使有混淆代码,许可证的东西也会被破解,程序可能会被修改,以具有稍微不同的行为(以同样的方式,将代码编译为二进制并不能帮助保护本机程序)。
除了符号混淆可能是一个好主意,不重构代码,这使得一切更加混乱,例如,调用图形指向许多不同的地方,即使实际上这些不同的地方最终做同样的事情。
模糊代码中的逻辑签名(例如,你可以创建程序逻辑使用的值表,但也可以用作签名),可以用来确定代码来自你。如果有人决定使用您的混淆代码模块作为他们自己产品的一部分(甚至在重新混淆它使它看起来不同之后),您可以表明,该代码是通过您的秘密签名窃取的。
保护代码的唯一可靠方法是在您控制的服务器上运行它,并为您的客户机提供与该服务器接口的客户机。