我将如何打包和出售Django应用程序?
目前,我正在托管为自己的客户开发的Django应用程序,但现在我开始考虑将其出售给人们以供他们托管。
我的问题是:如何包装和出售Django应用程序,同时保护其代码不被盗用或者盗窃?分发一堆.py文件听起来不是一个好主意,因为我出售给他们的人也可以复制它们并将其继续传递。
我认为出于这个问题的目的,可以安全地假设每个购买此产品的人都将运行相同的(LAMP)安装程序。
解决方案
我要去的方式是这样的:
- 加密所有代码
- 编写一个安装程序,使用计算机的主机名和许可证文件与服务器联系,并获取解密密钥,然后解密代码并将其编译为python字节码
- 添加(在安装程序中)一个模块,该模块在导入时检查计算机的主机名和许可证文件,如果不匹配,则将其终止
这样,用户仅在主机名更改和首次安装时才需要与服务器联系,但是我们会获得一小部分安全性。我们可以将主机名更改为更复杂的名称,但实际上没有必要-任何想要盗版的人都可以这样做,但是这样的简单机制将使诚实的人保持诚实。
我们可以将整个内容打包为一个Amazon Machine Instance(AMI),然后让它们在Amazon EC2上运行应用程序。此解决方案的好处是,Amazon将为我们计费,并且由于我们正在分发整个机器映像,因此可以确定所有客户端都使用相同的LAMP堆栈。 AMI是加密的机器映像,可以根据需要进行配置。
我们可以让亚马逊向客户收取一次性费用,基于使用量的费用或者月租费。
当然,此解决方案要求客户在Amazon托管其应用程序,并支付适当的费用。
不要尝试混淆或者加密永远不会起作用的代码。
我建议"以服务形式"出售Django应用程序,或者为他们托管它,或者向他们出售代码和支持。撰写合同,禁止他们重新分发。
就是说,如果我们决定以某种方式混淆代码,则可以将整个Python应用程序完全分发为.pyc(Python编译的字节码)。Py2App就是这样工作的。
它仍然可以重新分发,但是编辑文件将非常困难,因此我们可以添加一些基本的许可内容,而不会被一些#挫败。
就像我说的那样,我认为我们不会通过加密或者混淆等手段成功地进行反盗版。根据客户的不同,一份简单的合同以及一些真正的基本检查将比复杂的解密系统走得更远(并且使使用应用程序的体验更好,而不是希望不会更糟)
我们将永远无法从真正想要它的人那里获得源代码。最好现在就解决这个问题,并在以后省掉自己的头痛。
我们可能要考虑的一件事是FogBugz的工作。只需包含一个为目标平台编译的小二进制文件(也许是C程序),并包含用于验证许可证的代码。
这样,我们可以使诚实的人保持诚实,而头痛却很少。
"加密" Python源代码(或者字节码,或者实际上是使用该语言的任何语言的字节码-不仅是Python)就像有些JavaScript在某些人放在网页上以尝试禁用鼠标右键的事情一样,宣称"你不能偷我的照片!"
解决方法是微不足道的,不会阻止坚定的人员。
如果我们真的很认真地打算销售一款Python软件,则需要采取认真的行动。支付律师起草许可/合同条款,在购买时让人们同意它们,然后让他们拥有实际的软件。这意味着,如果有人违反许可/合同条款,就必须将他们拉上法庭,但是无论如何(例如,如果有人破坏了"加密"并开始分发软件),我们都必须这样做。从长远来看,已经在纸上设置了法律文字的实际适当形式及其签名,对业务将是更好的选择。
但是,如果我们真的对人们"偷"软件感到偏执,那就坚持使用托管模型,不要让他们访问服务器。许多成功的企业都基于该模型。