如果openssl
使用大量 CPU,则不会阻塞等待“熵”。OpenSSL 在这方面实际上是理智的,它使用加密安全的 PRNG将初始种子扩展到所需的尽可能多的位。
使用时dhparam
,OpenSSL 不仅会生成 DH 参数;它还想通过注意使用所谓的“强素数”作为模数来维护他的社会地位,这对安全性毫无用处,但需要更多的计算工作。“强素数”是一个素数p使得 ( p -1)/2 也是素数。素数生成算法如下所示:
- 生成一个随机奇数p。
- 检验p是否为素数。如果没有,则循环。
- 测试 ( p -1)/2 是否为素数。如果没有,则循环。
随机奇数 4096 位整数是素数的概率约为 1/2000,并且由于p和 ( p -1)/2 都必须是素数,因此平均需要生成和测试大约400 万个奇素数的素数。这势必需要一些时间。
从 2048 位到 4096 位时,强素数密度除以 4,素数测试也会慢 4 倍左右,所以如果生成 2048 位 DH 模数平均需要 1 小时,同样使用相同软件的机器将平均使用 16 小时来获得 4096 位 DH 模数。这只是平均值;每一代都可能更快或更慢,这取决于你的运气。
合理的解决方案是添加-dsaparam
选项。
openssl dhparam -dsaparam -out /etc/ssl/private/dhparam.pem 4096
此选项指示 OpenSSL 生成“类似 DSA”的 DH 参数(p使得p -1 是较小素数q的倍数,并且生成器具有乘法顺序q)。这要快得多,因为它不需要嵌套素数测试,因此只会生成和测试数千个而不是数百万个候选者。
据学术界所知,DH 的类似 DSA 的参数同样安全;使用“强素数”没有实际优势(该术语是传统的,实际上并不意味着一些额外的力量)。
同样,您也可以使用 2048 位模数,它已经非常远离“不能破坏它的区域”。4096 位模数将使 DH 计算变慢(这对 VPN 来说不是真正的问题;这些仅在连接开始时发生),但实际上不会提高安全性。
在某种程度上,4096 位模数可能会吸引审计员,但审计员不太可能对 Raspberry-Pi 印象深刻,反正它太便宜了。