PGP / GPG签名的Python代码

时间:2014-01-14 19:37:12

标签: python import gnupg pgp

我想(PGP / GPG)签署python代码。是的,我已阅读this和许多其他网站谈论保护混淆 python代码 - 这一切都我是什么想。我不想混淆代码。 我希望客户和用户能够看到代码,他们可以修改代码,复制代码并进行衍生工作,我希望将软件置于GPLv3下。 但是我想拥有“已签名”的插件,因此在执行期间它们可以是可信任的

这在Python中可行吗?检查gpg签名后我可以导入库吗? 什么是容易的:检查文件的gpg签名,然后通过导入加载,否则引发异常。但这只适用于单文件导入,而不是目录python模块。

很明显,如果客户在程序中更改了GPG密钥,或者在检查算法中自己删除了一些行,那么一切都消失了 - 但这不是问题。 他可以做任何他想做的事 - 但这很愚蠢。 他想要的是值得信赖。 我想让他通过将其复制到“插件”目录中来添加第三方插件,并让程序检查插件的“可信度” - 然后导入它。 (所以他可以运行签名的插件,但风险自负。)

2 个答案:

答案 0 :(得分:7)

Python的import mechanism已经提供了实现您想要的所有必要工具。您可以安装不同类型的import hooks以支持您想要的内容。

特别是您可能会发现安装meta path hook以便搜索“已签名的模块”并返回能够执行此签名格式导入的Loader

签名插件的一种非常简单方便的格式是zip存档,其中包含:

  1. 模块/包
  2. 形式的插件代码
  3. 上述代码的PGP签名
  4. 这样:

    • 您的装载机应打开拉链包装,并检查签名。如果它匹配,那么您可以安全地加载插件,如果它不匹配,您应该要求用户信任该插件(或不信任并中止)
    • 如果用户想要修改插件,只需解压缩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 ++源代码。您可以扩展加载程序以进行其他验证,甚至在检测到代码被篡改时采取措施(例如撤消篡改......)。