推荐的Python加密模块是什么?

34

我一直在探索Python中可用的加密模块,发现了3个:ezPyCrypt、yawPyCrypt和KeyCzar(实际上支持多种语言,包括Python)。前两者依赖于PyCrypto模块。

是否有我错过的选择?是否有明显更易于使用和功能更强大的候选项,还是只是取决于一个人的舒适水平?

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

我将使用这个库进行数字签名签署和验证,可能还要用于密钥创建(尽管如果我必须调用其他功能来实现这个功能,我也不会哭泣)。

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


更新了我的回答,包括Python-gnupg的API概述。 - Vinay Sajip
Python-gnupg的0.2版本现已发布 - 已经测试过与Python 3.0兼容。 - Vinay Sajip
从Python 2.6版本开始,有一个名为ssl的标准库,它提供了用于套接字对象的TLS/SSL包装器(参考http://docs.python.org/2/library/ssl.html)。 - Robert Lujo
8个回答

25

一款新的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。


2
现在已经过去了几年,这个库变得更加成熟。据我所知,它主要成功地成为了Python加密的事实标准库。 - John Y

12
如果您的环境包括GnuPG和Python >= 2.4,则可以考虑使用python-gnupg等工具。 (免责声明:我是该项目的维护者)。 它将繁重的工作留给,并提供了一个相当简单的API。
API概述:
>>> import gnupg
>>> gpg = gnupg.GPG(gnupghome='/path/to/keyring/directory')
>>> gpg.list_keys()
[{ ... 'fingerprint': 'F819EE7705497D73E3CCEE65197D5DAC68F1AAB2', 'keyid': '197D5DAC68F1AAB2', 'length': '1024', 'type': 'pub', 'uids': ['', 'Gary Gross (A test user) ']}, { ... 'fingerprint': '37F24DD4B918CC264D4F31D60C5FEFA7A921FC4A', 'keyid': '0C5FEFA7A921FC4A', 'length': '1024', ... 'uids': ['', 'Danny Davis (A test user) ']}] >>> encrypted = gpg.encrypt("Hello, world!", ['0C5FEFA7A921FC4A']) >>> str(encrypted)
'-----BEGIN PGP MESSAGE-----\nVersion: GnuPG v1.4.9 (GNU/Linux)\n \nhQIOA/6NHMDTXUwcEAf ... -----END PGP MESSAGE-----\n' >>> decrypted = gpg.decrypt(str(encrypted), passphrase='secret') >>> str(decrypted) 'Hello, world!' >>> signed = gpg.sign("Goodbye, world!", passphrase='secret') >>> verified = verified = gpg.verify(str(signed)) >>> print "Verified" if verified else "Not verified"
'Verified'

我很感兴趣...您能否简要解释一下为什么会使用py-gpg而不是PyCrypt呢? - hewhocutsdown
1
请注意,我尚未测试Python 3.x与python-gnupg的兼容性,请谨慎使用。 - Vinay Sajip
非常好,感谢您提供的代码示例。我会在3.x上测试它,并让您知道我的发现。 - hewhocutsdown
(免责声明:我是这个项目的维护者。)“免责声明”不是说你不拥有某物,而是说你拥有它吗? - Mathime
1
@Mathime - 我声明我提供的是客观、独立的建议。这是你通常在一个答案中期望的,所以我认为指出我与所提出的解决方案有关联是公平的。 - Vinay Sajip
显示剩余2条评论

10

可以考虑使用另一个加密库PyCryptodome,它是PyCrypto的一个分支,支持PyPy并提供了一些更多的基元(SHA-3、Salsa20、scrypt等)。


8

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

另一个主要的选择(像pycrypto一样强大而复杂的项目)是pyopenssl,它是OpenSSL的相当普通的包装器(如作者所描述的“薄包装器”),如果您习惯于使用C编码并调用OpenSSL,则可能是一个优点。分发完整的替代包装(附带所需的库)并且可能在法律上更安全(排除存在专利争议或怀疑的部分)的是由egenix分发的。

这两个主要项目(pycrypto和pyopenssl)都经历了长时间的不活动期,因为原始作者转向其他事物,但现在两者都在积极开发和维护,这总是一个好迹象。

我不知道是否有易于使用的包装器建立在pyopenssl之上(很可能有,但它们没有像pycrypto之上的那些被公开宣传),因此,如果您关心易用性并且不想编写自己的包装器,则建立在pycrypto之上的那些包装器似乎是更好的选择。


在某个时候这可能会改变,但目前我远远没有能力编写那种类型的包装器。:)所以我可能还是会坚持使用pycrypto,除非这个py-gpg的想法更好。谢谢你指出pyopenssl! - hewhocutsdown

4
上周我刚做了一项调查,并采用了M2Crypto,它似乎是目前最先进的openssl包装器(在谷歌搜索中发现它出现在几个推荐列表中)。我也尝试过pycrypto,但它缺少证书管理和标准密钥文件格式管理,而M2Crypto具有这些功能(使用pycrypto需要pickle / unpickle您的密钥或编写自己的密钥管理器以处理常见格式)。
我发现M2Crypto很容易使用,并且很快就能开发出我所需的内容(签名和加密的软件包格式)。
然而,我建议下载完整的软件包,而不仅仅是简单地安装它,因为在软件包中,您还可以获得漂亮的示例(请查看演示目录)。
这是链接:http://pypi.python.org/pypi/M2Crypto/0.20.1 一个缺点可能是如果您正在使用Python 3.0,我在工作中被困在2.5中(希望很快升级到2.6),并且不知道M2Crypto是否与Python 3.0兼容。
我还没有太多实践经验,但如果您遇到具体问题,请在此处提问。会有人回答。

3

PyCrypto是我目前的选择(最新的pypi更新于2012年5月24日),源代码托管在GitHub上:https://github.com/dlitz/pycrypto。它可以运行纯Python数学,也可以使用libgmp(在Debian上需要sudo apt-get install libgmp-dev来启用最新版本)。

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

GnuPG(更新于2013年06月05日),请参见Vinay Sajip的答案。有一个补丁修复的分支(更新于2013年07月31日),托管在https://github.com/isislovecruft/python-gnupg上。

其他选择由Alex Martelli提到。

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


2

谢谢,但这就是我已经引用的(它是ezPyCrypt和其他包装器所包装的PyCrypt)。 - hewhocutsdown
2
PyCrypto似乎已经不再维护。请参见https://github.com/dlitz/pycrypto/issues/173 - Elias Zamaria

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接