我一直在阅读/dev/urandom
,据我所知,/dev/random
通过利用网络数据包时序等几个事件来创建加密随机数。但是,我是否理解正确/dev/urandom
使用PRNG,种子来自/dev/random
?或者它只是使用/dev/random
只要有位 - 当它们用尽时它会回落到某个PRNG,从那里收集种子?
答案 0 :(得分:93)
来自urandom
联机帮助页:
虽然使用环境数据和熵池使得它在天文学上更难以破解PRNG,但是如果没有收集完全相同的环境数据,那么它们都使用PRNG。随机数发生器收集 设备的环境噪音 司机和其他来源变成了 熵池。发电机也 估计数量 熵池中的噪声比特。 从这个熵池随机数 是创造的。
读取时,/ dev / random设备 只返回其中的随机字节 估计的噪声比特数 在熵池中。的/ dev /随机 应该适合需要的用途 非常高质量的随机性 作为一次性垫或钥匙 代。 当熵池时 是空的,从/ dev / random将读取 阻止直到额外的环境 噪音聚集。
来自/ dev / urandom设备的读取不会阻止等待更多 熵即可。结果,如果有的话 熵中没有足够的熵 池,返回值是 理论上容易受到影响 对算法的加密攻击 由司机使用。了解如何 这样做是不可用的 目前未分类的文献,但 这在理论上是可能的 可能存在攻击。如果这是一个 关注您的应用程序,使用 / dev / random而不是。
根据经验,如果没有从量子事件中收集数据的专用昂贵硬件,就不会出现真正的随机数发生器(即产生真正不可预测数量的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
可能是更好的选择: