我正在测试一些使用python-gnupg
加密/签名/解密某些明文的代码,我想动态生成密钥对。 GnuPG(当然)在产生密钥对时是超级偏执的,它从我的系统中吸收了很多熵。
我在unix.stackexchange.com
上找到了this answer,但使用rngd
从/dev/random
获取/dev/urandom
听起来像个坏主意。
由于我正在测试我不需要高安全性,我只需要尽快生成密钥对。
一个想法是离线预生成一些键,并在我的测试中使用这些键。无论如何,我想在执行测试时以编程方式生成临时密钥对。
这是我现在使用的代码(也就是说,超级慢,不适合测试):
from tempfile import mkdtemp
import gnupg
def temp_identity():
identity = gnupg.GPG(gnupghome=mkdtemp())
input_data = gpg.gen_key_input(key_type='RSA', key_length=1024)
identity.gen_key(input_data)
return identity
答案 0 :(得分:3)
使用任何方法将/dev/random
更改为退出/dev/urandom
,一旦熵池以适当的随机状态启动(这在硬件x86机器上不是问题,但可能需要)讨论其他设备)。我强烈建议观看The plain simple reality of entropy -- Or how I learned to stop worrying and love urandom,这是32C3的演讲。
如果您想要快速生成密钥生成,请考虑使用较小的密钥大小,例如RSA 512(1k密钥也不是非常安全的)。这会使密钥不安全,但如果测试没问题 - 那么就去做吧。使用另一种算法(例如,如果您已经有GnuPG 2.1,则使用椭圆曲线)也可以加快密钥生成。
如果您真的想坚持使用/dev/random
并且较小的密钥尺寸不能提供足够的性能,您可以很好地预生成密钥,使用gpg --export-secret-keys
导出密钥并导入它们而不是创造新的。
gpg-agent
也知道选项--debug-quick-random
,它似乎适合您的用例,但我以前从未使用过它。来自man gpg-agent
:
<强>
--debug-quick-random
强>此选项禁止使用非常安全的随机质量级别(Libgcrypt的
GCRY_VERY_STRONG_RANDOM
),并将所有请求降级到标准随机质量。它是 仅用于测试,不得用于任何生产质量的钥匙。此选项仅在命令行上给出时有效。