【问题标题】:Recommended Python cryptographic module?推荐的 Python 加密模块?
【发布时间】:2010-11-11 09:26:05
【问题描述】:

我一直在探索 Python 可以使用哪些加密模块,我发现了 3 个:ezPyCrypt、yawPyCrypt 和 KeyCzar(它们实际上支持几种语言,但其中包括 Python)。前两个依赖于 PyCrypto 模块。

有没有我错过的选择?在易用性和功能方面是否有明确的领先者,或者它只是归结为一个人的舒适程度?

我目前倾向于 KeyCzar,ezPyCrypt 紧随其后。

我将使用该库进行数字签名签名和验证,并可能用于创建密钥(尽管如果我必须为该功能调用其他东西,我不会哭)。

我正在使用 Python 3.x 并且可以访问 GPG。

【问题讨论】:

  • 用 python-gnupg 的 API 概述更新了我的答案
  • python-gnupg 0.2 版现已推出 - 使用 Python 3.0 测试
  • 从 python 2.6 版本开始,有一个标准库 ssl“用于套接字对象的 TLS/SSL 包装器”(参考 docs.python.org/2/library/ssl.html)。

标签: python cryptography


【解决方案1】:

一个新的 Python 密码库已经快速开发了几个月。 0.2.1 的发布就在几天前。

https://cryptography.io/en/latest/

它主要是对现有 C 库(如 OpenSSL)的 CFFI 包装器。它作为纯 python 模块分发,支持 CPython 版本 2.6 - 3.3 以及 PyPy。它也是重构后的 pyOpenSSL 包的上游。

它旨在公开使密码学尽可能防白痴的高级“配方”以及仅应谨慎使用的原语。对称算法(包括 AES-GCM)得到很好的支持,RSA 和 DSA 等非对称算法应该会在接下来的几个版本中出现。其他受支持的著名算法包括 PBKDF2、HKDF、HOTP 和 TOTP。

【讨论】:

  • 现在几年过去了,这个库变得更加成熟。据我所知,它已经成功地成为事实上的密码学标准 Python 库。
【解决方案2】:

如果您在包含 GnuPG 和 Python >= 2.4 的环境中,那么您还可以考虑使用诸如 python-gnupg 之类的工具。 (免责声明:我是这个项目的维护者。)它将繁重的工作交给 gpg,并提供了一个相当简单的 API。

API 概览:

>>> 导入 gnupg >>> gpg = gnupg.GPG(gnupghome='/path/to/keyring/directory') >>> gpg.list_keys() [{ ... '指纹': 'F819EE7705497D73E3CCEE65197D5DAC68F1AAB2', 'keyid': '197D5DAC68F1AAB2', “长度”:“1024”, “类型”:“酒吧”, 'uids': ['', 'Gary Gross (A test user)']}, { ... '指纹': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A', 'keyid': '0C5FEFA7A921FC4A', “长度”:“1024”, ... 'uids': ['', 'Danny Davis(测试用户)']}] >>> 加密 = gpg.encrypt("Hello, world!", ['0C5FEFA7A921FC4A']) >>> str(加密) '-----BEGIN PGP MESSAGE-----\n版本:GnuPG v1.4.9 (GNU/Linux)\n \nhQIOA/6NHMDTXUwcEAf ... -----结束 PGP 消息-----\n' >>> 解密 = gpg.decrypt(str(encrypted), passphrase='secret') >>> str(解密) '你好世界!' >>> signed = gpg.sign("再见,世界!", passphrase='secret') >>> 已验证 = 已验证 = gpg.verify(str(signed)) >>> 如果已验证,则打印“已验证”,否则“未验证” “已验证”

【讨论】:

  • 我很感兴趣...您能不能简单解释一下为什么要使用 py-gpg 而不是 PyCrypt?
  • 为了更轻松地与其他系统的互操作性以及 API 是否更符合您的需求。例如,我最近与一家大型国际银行合作了一个项目,该银行使用 GnuPG 将加密数据发送给我的客户。使用 GnuPG 完成我们的工作,无需担心零兼容性和互操作问题。
  • 注:我还没有使用 Python 3.x 测试过 python-gnupg - 请记住这一点。
  • 非常好,感谢您提供的代码示例。我会用 3.x 敲击它,我会告诉你我是如何找到它的。
  • @Mathime - 我声明我提供的是无私的、独立的建议。这就是您通常期望的答案,所以我认为指出我与提议的解决方案有联系是公平的。
【解决方案3】:

另一个需要考虑的加密库是 PyCryptodome,它是 PyCrypto 的一个分支,支持 PyPy 和更多原语(SHA-3、Salsa20、scrypt 等)。

【讨论】:

    【解决方案4】:

    pycrypt 实际上是一个简单的 AES 加密/解密模块,它建立在 pycrypto 之上,就像您提到的其他模块一样——请注意,后者正在转换到 pycrypto.org URL,因为它正在改变维护者、稳定版本和文档仍在原作者的site。除了您提到的更易于使用的包装器之外,pycrypto 的一个优点是它的纯 python subset 由 Google 的 App Engine 提供,因此如果您想部署任何工具,熟悉它会很有用代码在那里。

    主要的替代品(另一个强大而复杂的项目,如 pycrypto)是 pyopenssl,它是 OpenSSL 的相当常规的包装(作者描述的“薄包装器”)(这可能是一个加号)如果你习惯用 C 语言编写代码并调用 OpenSSL)。由egenix 分发完整的替代包装(随附所需的库)并且可能在法律上更安全(不包括存在专利争议或疑问的部分)。

    两个主要项目(pycrypto 和 pyopenssl)都经历了长时间的或多或少的闲置,因为原作者继续从事其他工作,但两者都在积极开发和维护,这始终是一个好兆头。

    我不知道 pyopenssl 上易于使用的包装器(很可能有,但它们没有像 pycrypto 上的包装器那样被宣传),所以,如果你看起来确实关心易用性使用并且不打算自己编写包装器,pycrypto 之上的包装器似乎是一个更好的选择。

    【讨论】:

    • 在某些时候这可能会改变,但目前我还没有能力编写那种包装器。 :) 所以我可能会坚持使用 pycrypto,除非这个 py-gpg 想法更好。感谢您指出 pyopenssl!
    【解决方案5】:

    我上周刚刚完成了一项调查,并采用了 M2Crypto,它似乎是当今 openssl 之上最先进的包装器(在谷歌搜索时在几个推荐列表中找到了它)。我也尝试过 pycrypto,但它错过了 M2Crypto 所具有的证书管理和标准密钥文件格式管理(使用 pycrypto,您必须腌制/取消加密密钥或为常用格式编写自己的密钥管理器)。

    我发现 M2Crypto 非常易于使用,并且能够快速开发我需要的东西(签名和加密的包格式)。

    但是我建议下载完整的包,而不是简单地安装它,因为在包中你也可以得到很好的例子(查看演示目录)。

    这里是链接http://pypi.python.org/pypi/M2Crypto/0.20.1

    一个缺点可能是您使用的是 python 3.0,我在工作中坚持使用 2.5(希望很快 2.6)并且不知道 M2Crypto 是否适用于 python 3.0

    我还没有太多的练习,如果你有具体的问题,请在这里问。有人可能会回答。

    【讨论】:

      【解决方案6】:

      PyCrypto是我的选择atm(最新的pypi更新2012-05-24),源代码托管在GitHub上:https://github.com/dlitz/pycrypto。它可以运行纯 Python 数学运算或使用 libgmp(在 Debian 上需要 sudo apt-get install libgmp-dev 才能启用最新版本)。

      M2Crypto 是 OpenSSL 的包装器(最新的 pypi 更新 2011-01-15),源代码位于 http://svn.osafoundation.org/m2crypto/

      gnupg(2013 年 6 月 5 日更新),请参阅Vinay Sajip's answer。有一个patched fork(2013-07-31 更新)托管在https://github.com/isislovecruft/python-gnupg

      Alex Martelli 提到了其他替代方案

      编辑:对现有加密包的批评和对一些新包的引用https://news.ycombinator.com/item?id=6194102

      【讨论】:

        【解决方案7】:

        【讨论】:

        【解决方案8】:

        Keyczar 很酷,但它缺少仅在 Java 版本中可用的 OAEP|PKCS 填充。 https://code.google.com/p/keyczar/wiki/KeyczarTool

        此外,目前它缺少 C++ 中可用的基于密码的加密。 https://code.google.com/p/keyczar/issues/detail?id=149&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Implementation%20Summary

        【讨论】:

          猜你喜欢
          • 2020-11-21
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          • 2012-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多