我理解/ dev / urandom吗?

时间:2010-09-11 08:07:03

标签: linux unix random cryptography

我一直在阅读/dev/urandom,据我所知,/dev/random通过利用网络数据包时序等几个事件来创建加密随机数。但是,我是否理解正确/dev/urandom使用PRNG,种子来自/dev/random?或者它只是使用/dev/random只要有位 - 当它们用尽时它会回落到某个PRNG,从那里收集种子?

3 个答案:

答案 0 :(得分:93)

来自urandom联机帮助页:

  

随机数发生器收集   设备的环境噪音   司机和其他来源变成了   熵池。发电机也   估计数量   熵池中的噪声比特。   从这个熵池随机数   是创造的。

     

读取时,/ dev / random设备   只返回其中的随机字节   估计的噪声比特数   在熵池中。的/ dev /随机   应该适合需要的用途   非常高质量的随机性   作为一次性垫或钥匙   代。 当熵池时   是空的,从/ dev / random将读取   阻止直到额外的环境   噪音聚集。

     

来自/ dev / urandom设备的读取不会阻止等待更多   熵即可。结果,如果有的话   熵中没有足够的熵   池,返回值是   理论上容易受到影响   对算法的加密攻击   由司机使用。了解如何   这样做是不可用的   目前未分类的文献,但   这在理论上是可能的   可能存在攻击。如果这是一个   关注您的应用程序,使用   / dev / random而不是。

虽然使用环境数据和熵池使得它在天文学上更难以破解PRNG,但是如果没有收集完全相同的环境数据,那么它们都使用PRNG。

根据经验,如果没有从量子事件中收集数据的专用昂贵硬件,就不会出现真正的随机数发生器(即产生真正不可预测数量的RNG);虽然出于加密目的,/ dev / random或/ dev / urandom就足够了(使用的方法是CPRNG,加密伪随机数生成器)。

使用/ dev / random的熵池和阻塞读取作为安全防护,以确保不可能预测随机数;例如,如果一个攻击者耗尽了系统的熵池,尽管今天的技术极不可能,他可以预测/ dev / urandom的输出很长时间没有被重新接种(尽管如此)这也需要攻击者耗尽系统收集更多熵的能力,这也是天文数据不可思议的。)

答案 1 :(得分:31)

实际上你在实践中需要的是FreeBSD的/dev/urandom提供的内容:它将从/dev/random读取一个足够长度的初始种子,然后使用PRNG。因此,它可能最初阻塞(刚刚在系统启动之后)但是一旦它收集了足够的熵,它就永远不会阻塞。这提供了大多数加密协议所需的随机性级别,而不是过度阻塞。

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

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

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

答案 2 :(得分:8)

引用here

  熵池耗尽后,

/dev/random将被阻止。它将保持阻塞状态,直到从可用的熵源收集到其他数据。这可能会减慢随机数据的生成速度。

     

/dev/urandom不会阻止。相反,它将重用内部池来产生更多的伪随机位。

/dev/urandom最适合用于:

  • 您只需要一个包含随机数据的大型文件进行某种测试。
  • 您正在使用dd命令通过将数据替换为随机数据来擦除磁盘上的数据。
  • 几乎在其他任何您没有充分理由使用/dev/random的地方。
在以下情况下,

/dev/random可能是更好的选择:

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