熵和随机数

熵(entropy)

熵池是指当前系统的环境噪声,熵指系统的混乱程度。生成SSH密钥时,确保系统中存在足够不可预测的熵( unpredictable entropy )非常重要。

在Internet上曾经发生过由于没有足够的随机生成的服务器密钥导致数千设备使用了相同的主机密钥。

强烈建议在安装操作系统时收集随机数据,并将随机数据保存到种子文件。然后重新启动系统,在启动过程中再次收集更多的随机数据,然后混合两次采集的随机数据,最后在根据混合后的随机数据来生成主机密钥。这样可以最大程度利用随机性,并确保定期对随机种子文件进行更新,尤其在确保生成SSH主机密钥后对其更新。

很多现代化通用CPU提供了硬件随机数生成器,对解决上述问题很有帮助。最佳时间是结合多种方式收集 ,将这些熵保存在随机种子文件中,并从硬件随机数生成器中混合一些熵。这样即使其中之一受到某种程度对损害(例如硬件安全漏洞),另一个随机数据源也能确保密钥安全。

SSL和熵

有时候服务器会出现一些非常古怪的SSL问题,非常隐秘的 可能有所关联 - 排查Docker容器ssh服务Crash

Linux中随机数设备

Linux系统中有2个随机数生成设备文件:

  • /dev/random

  • /dev/urandom

上述两个设备是利用系统的熵池来计算出一定数量的随机比特,然后将随机比特作为字节流返回。

/dev/random 的random pool依赖于系统中断,所以在系统中断不足时, /dev/random 会一直阻塞,这样就会导致读取这个设备的进程进入等待,直到系统的中断数足够。虽然 /dev/random 通常性能较差(受限于中断数量),但是 /dev/random 生成的随机性要好于 /dev/urandom 设备。

/dev/urandom 设备的 u 前缀表示 ublock ,也就是在不能产生足够的随机性数据时也不会阻塞程序。这也意味着生成的随机性效果不佳,好处是快速。

对于加密解密应用来说, /dev/urandom 设备的随机性不够,所以通常不是好的选择。但是 /dev/random 性能也可能满足不了速度要求。

测试 random 性能

参考