licensing - 如何保护Python代码?

  显示原文与译文双语对照的内容

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

如果我们分发. py 文件甚至. pyc 文件,就可以轻松删除检查许可证文件的代码。

另一个方面是我的雇主不想让我们的客户读取代码,担心代码可能被窃取或者至少是"新奇的想法"。

是否有好的方法来处理这个问题? 最好使用off-the-shelf解决方案。

软件将在Linux系统( 所以我认为py2exe不会这么做) 上运行。

时间:

python 是一种byte-code-compiled解释语言,很难锁定。 即使你使用像 py2exe 这样的exe-packager,可以执行程序的布局也是众所周知的,并且 python byte-codes很容易理解。

通常情况下,你必须做出权衡。 保护代码有多重要? ( 例如银行转帐的对称加密密钥) 有真正的秘密,或者你只是在妄想? 选择了语言,它可以让你开发出最好的产品最快的,而且是现实的关于你小说的概念是多么有价值。

在如果你决定你是否真正需要实施的许可检查安全地,把它作为小型C 扩展插件,以便可以将许可证校验码 extra-hard ( 但不是不可能) 导致逆向工程,并保持你的大部分的代码 !

"是否有好方法来处理这里问题"否。 没有什么可以防止反向工程。 即使DVD机器上的固件已经被反向工程, AACS加密密钥也公开了。 这也是由于臭名昭著的暴行。

由于没有技术方法可以阻止你的客户读取你的代码,所以你必须应用普通的商业方法。

  1. 许可证。合同。条款和条件。 即使人们可以读取代码,这仍然可以工作。 请注意,某些Python-based组件可能要求你在使用这些组件销售软件之前支付费用。 另外,某些open-source许可证禁止你隐藏该组件的来源或者来源。

  2. 提供巨大的价值。如果你的东西是那么好--售价都很难拒绝--所以根本没有必要浪费时间和金钱逆向工程任何东西。 反向工程是昂贵的。让你的产品稍微便宜一点。

  3. 提供升级和增强,使任何反向工程成为一个糟糕的想法。 当下一个版本破坏他们的反向工程时,没有一点。 这可能会产生荒谬的极端,但是你应该提供新的特性,使下一个版本比反向工程更有价值。

  4. 提供定制在利率吸引人之处,他们宁愿支付你自己构建和支持增强功能。

  5. 使用过期的许可证密钥。 这很残忍,而且会给你一个不好的名声,但这肯定会让你的软件停止工作。

  6. 将它作为网络服务提供。 SaaS对客户没有任何下载。

python 不是你需要的工具

你必须使用正确的工具做正确的事情,而 python 不是设计成模糊的。 相反,一切都是开放的,或者在 python 中显示或者修改,因为这是语言哲学。

如果你想要一些你看不见的东西,找另一个工具。 这不是一件坏事,重要的是不同的用法有不同的工具。

模糊处理非常困难

即使编译过的程序也可以是 reverse-engineered,所以不要认为你可以完全保护任何代码。 你可以分析模糊的PHP,中断 Flash 加密密钥,等等 更新的版本每次都会被破解。

有一个合法的需求是一个

你不能阻止别人滥用你的代码,但是你可以很容易地发现某人是否有。 因此,这只是一个偶然的法律问题。

代码保护被高估了

现在,商业模型倾向于出售服务而不是产品。 你不能复制服务,盗版或者窃取它。 也许是时候考虑使用流了。

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

以下是我的建议:

( a ) 将代码的关键部分作为C 或者 C++ 库编写,然后使用 SIP 或者 swig将 C/C++ api公开给 python 命名空间。

( b ) 使用 cython,而不是 python

( c ) 在( 一个) 和( b ) 中,可以使用 python 接口将库分发为许可的二进制文件。

编译 python 并分发二进制文件 !

明智的想法:

使用 Cython ( 或者类似的东西) 编译 python 到C 代码,然后将你的应用程序作为 python 二进制库( pyd ) 分发。

这样,就不会留下 python ( 字节) 代码,并且你已经执行了任何合理的obscurification ( 例如 ) 。 你的雇主可能会从普通代码中期望,我认为。 (.NET 或者Java在这种情况下不安全,更可能更少。

Cython越来越与CPython兼容,所以我认为它应该能工作。 ( 我实际上是在考虑我们的产品。) 。 于我们装船),我们在一起已经开始制造一些第三方libs为 pyd/dll,所以相关我们自己的python 代码作为二进制文件不是一个过于大的一步

关于如何执行这里操作的教程,请参阅这篇博客文章 ( 不是由我) 。 ( thx @hithwen)

疯狂的想法:

通过重inlining,你或许可以查到Cython选项可以用来为每个模块,则仅仅是将试看,构建将C-files单独留存。 这样,你的python 模块就很简单了,很难用普通的工具来处理。

超过疯狂的

你可能能够建立一个单一的可执行文件如果你可以链接静态( dlls ) ( 并与之进行优化) python 运行时和所有的库的。 这样,拦截来自 python的调用和你使用的任何框架库都很困难。 如果你正在使用LGPL代码,这就无法完成。

你的雇主知道他能从你的代码中恢复其他人的想法? 我的意思是,如果他们能阅读你的作品,你能。 也许看着你可以受益于这种情况会比用不着担心有多少会失去别人对你的投资产生更大的收益。

[EDIT] 评论评论:

什么也没有得到,什么也没有丢失。 顾客有他想要的东西。 因为他不释放更改,所以就好像不是其他人。

现在如果客户出售软件,他们必须更改版权通知( 这是非法的,所以你可以起诉并获胜-> 简单案例) 。

如果他们不更改版权声明,2级的客户会注意到软件来自你的原创,并想知道发生了什么。 很有可能他们会联系你,所以你会学到转售你的工作。

我们有两种情况: 原始客户只卖出了几份副本。 这意味着他们没有赚多少钱,所以为什么要。 或者他们在卷里销售。 这意味着你有更好的机会去学习他们做什么并做一些事情。

但最后,大多数公司试图遵从法律( 一旦他们的声誉被破坏,业务就会变得更加困难) 。 所以他们不会偷你的工作,而是跟你一起改进它。 因此,如果你包括源( 使用一个许可证来防止简单转售),那么它们可能会简单地推迟更改,因为这将确保更改在下一个版本中,并且不需要维护它。 release,即双赢的官方数据中:即可更改,并且这些能使这个转变本身如确实,了那么一会需要它即使你又不愿意包括管它,

不依赖模糊处理。 就像你所做的那样,它提供了非常有限的保护。 更新:这是一个链接到纸,它反向工程的python 代码在 Dropbox 。 方法- 操作码重新映射是一个好的屏障,但显然它可以被打败。

相反,就像许多海报提到的那样:

  • 不值得逆向工程时间( 你的软件是如此的好,支付是有意义的)
  • 让他们签署合同并在可行的情况下进行许可审核。

或者,就像超级 python IDE WingIDE所做的那样: 放弃了自己的代码。 没错,让代码离开,让人们回来进行升级和支持。

在某些情况下,可以将软件的( 全部,或者至少一个关键部分) 移动到你的组织所主持的网络服务中。

这样,许可证检查可以在你自己的服务器房间的安全中执行。

尽管没有完美的解决方案,但可以执行以下操作:

  1. 将一些关键的启动代码移动到本地库中。
  2. 在本机库中实施许可证检查。

如果要删除对本机代码的调用,程序将不会启动。 如果没有被删除,那么许可证将被强制。

虽然这不是cross-platform或者pure-Python解决方案,但它将工作。

航运. pyc 文件本身存在的问题- - 它们并不与任何其他 python 兼容版本高于 python 版本它们,这意味着你必须知道哪些 python 地使用了版本是该产品将运行在该系统上运行。 这是个非常限制的因素。

...