我想(PGP / GPG)签署python代码。是的,我已阅读this和许多其他网站谈论保护和混淆 python代码 - 这一切都不我是什么想。我不想混淆代码。 我希望客户和用户能够看到代码,他们可以修改代码,复制代码并进行衍生工作,我希望将软件置于GPLv3下。 但是我想拥有“已签名”的插件,因此在执行期间它们可以是可信任的。
这在Python中可行吗?检查gpg签名后我可以导入库吗? 什么是容易的:检查文件的gpg签名,然后通过导入加载,否则引发异常。但这只适用于单文件导入,而不是目录python模块。
很明显,如果客户在程序中更改了GPG密钥,或者在检查算法中自己删除了一些行,那么一切都消失了 - 但这不是问题。 他可以做任何他想做的事 - 但这很愚蠢。 他想要的是值得信赖。 我想让他通过将其复制到“插件”目录中来添加第三方插件,并让程序检查插件的“可信度” - 然后导入它。 (所以他可以运行不签名的插件,但风险自负。)
答案 0 :(得分:7)
Python的import
mechanism已经提供了实现您想要的所有必要工具。您可以安装不同类型的import
hooks以支持您想要的内容。
特别是您可能会发现安装meta path hook以便搜索“已签名的模块”并返回能够执行此签名格式导入的Loader
。
签名插件的一种非常简单方便的格式是zip
存档,其中包含:
这样:
zip
存档并按照自己的意愿修改即可。zip
档案的导入已在zipimport
模块中实施。这意味着您不必从头开始重写加载程序。实际上,如果你想将钩子的代码减少到最小,你只需要验证签名,然后将zip
存档的路径添加到sys.path
,因为python已经处理即使没有明确使用zip
,也会从zipimport
归档。
使用此设计,您只需安装这些挂钩,然后您就可以import
插件,就好像它们是普通模块一样,验证等也会自动完成。
答案 1 :(得分:2)
我知道这是一个老帖子,但我们已经开发了一个新的解决方案。我们遇到了同样的挑战 - 分发python源代码,但是为了防止黑客篡改代码。我们开发的解决方案是使用signet http://jamercee.github.io/signet/为我们的应用程序创建自定义加载程序。
signet的作用是扫描脚本及其创建sha1哈希值的依赖项。它将这些哈希嵌入到自定义加载程序中,您可以使用脚本将其交付给客户。您的客户在将控制权转移到您的脚本以进行正常执行之前运行加载程序,该加载程序会重新验证哈希值。如果有篡改,则会发出错误消息,并拒绝运行篡改的代码。
Signet是多平台的,可以在windows,unix,linux,freebsd等上运行......如果你部署到windows,加载器构建过程甚至可以应用你的公司代码证书来100%验证你的代码。它也进行了PE验证。
代码是完全开源的,包括默认加载器模板的c ++源代码。您可以扩展加载程序以进行其他验证,甚至在检测到代码被篡改时采取措施(例如撤消篡改......)。