我了解/ dev / urandom?

我一直在阅读关于/dev/urandom ,据我所知, /dev/random通过利用networking数据包计时等几个事件来创buildencryption随机数。不过,我是否理解正确的/dev/urandom使用一个PRNG,从/dev/random加上一个数字? 或者,只要有一点点就可以使用/dev/random ,当它们用完时,就会从某处收集到一颗种子,然后回到PRNG。

urandom

随机数发生器将来自设备驱动器和其他源的环境噪声收集到熵池中。 发生器还保持熵池中的噪声位数的估计。 从这个熵池中创build随机数。

读取时,/ dev / random设备将只在熵池中的估计的噪声位数内返回随机字节。 / dev / random应该适用于需要非常高质量随机性的应用,例如一次性密钥或密钥生成。 当熵池为空时,从/ dev / random读取将被阻塞,直到收集到额外的环境噪声。

从/ dev / urandom设备读取不会阻塞等待更多的熵 。 因此,如果熵池中没有足够的熵,则返回的值理论上容易受到对驾驶员所使用的algorithm的密码攻击的影响。 目前未分类的文献中没有关于如何做到这一点的知识,但理论上可能存在这样的攻击。 如果这是您的应用程序中的一个问题,请使用/ dev / random。

两者都使用PRNG,尽pipe使用环境数据和熵池使得破解PRNG的天文数字难度更大,并且在不收集完全相同的环境数据的情况下也是不可能的。

作为一个经验法则,没有从量子事件中收集数据的专用昂贵的硬件,没有真正的随机数发生器(即产生真正不可预测的数字的RNG)这样的事情; 尽pipe为了encryption的目的,/ dev / random或/ dev / urandom就足够了(所使用的方法是用于CPRNG,密码伪随机数发生器)。

将/ dev / random的熵池和阻塞读取作为安全措施,以确保不可能预测随机数; 例如,如果一个攻击者耗尽了系统的熵池,那么尽pipe现在的技术是不太可能的,但他可以预测长时间没有被重新调用的/ dev / urandom的输出这也需要攻击者用尽系统收集更多熵的能力,这也是天文数字上不可能的)。

实际上FreeBSD的/dev/urandom提供的是:它会从/dev/random读取一个足够长度的初始种子,然后使用PRNG。 因此,它最初可能会阻塞(就在系统启动之后),但一旦收集到足够的熵,它就不会阻塞。 这提供了大多数encryption协议所需的随机性水平,而不是不适当的阻塞。

Linux的/dev/urandom是相似的,除了它永远不会阻塞,因此如果在引导之后使用,可能会返回低质量的随机性。 另一方面, /dev/random在启动时间之后甚至可能会阻塞,这也是一个问题。 我经常看到服务器神秘地失速,因为有些软件坚持使用/dev/random ,而没有键盘的服务器没有得到足够的熵。

通常的Linux发行版在关机时保存从/dev/urandom获得的随机种子,并在下次启动时注入,从而保证/dev/urandom提供的随机的质量。 只有在操作系统的安装过程中,密码质量才成为一个问题,而且通常不是因为安装涉及与执行安装的人类的许多交互,产生了大量的熵。

总之,在Linux和FreeBSD下,你应该使用/dev/urandom ,而不是/dev/random

在这里引用

/dev/random将在熵池耗尽后阻塞。 它将保持阻塞状态,直到从可用的熵源收集到额外的数据。 这可能会减慢随机数据的产生。

/dev/urandom不会阻塞。 相反,它将重新使用内部池来产生更多的伪随机比特。


/dev/urandom最适用于以下情况:

  • 你只需要一个随机数据的大文件进行某种testing。
  • 您正在使用dd命令通过将数据replace为随机数据来擦除磁盘上的数据。
  • 几乎在其他地方,你没有一个很好的理由来使用/dev/random

/dev/random在以下情况下可能是更好的select:

  • 随机性对于您的应用程序中的密码安全至关重要 – 一次性键盘,密钥生成。