我了解/ dev / urandom吗?


68

我一直在阅读/dev/urandom,据我所知,我/dev/random利用网络数据包定时等事件创建了密码随机数。但是,我是否理解/dev/urandom使用PRNG并从中植入数字的权利/dev/random?还是/dev/random只要有一点就使用它-当它们用完时会回落到PRNG并从哪里收集种子?

Answers:


94

urandom联机帮助页:

随机数发生器将来自设备驱动程序和其他来源的环境噪声收集到一个熵池中。发生器还保持熵池中噪声位数的估计。根据该熵池,创建随机数。

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

从/ dev / urandom设备进行的读取不会阻止等待更多熵。结果,如果在熵池中没有足够的熵,则返回值在理论上容易受到对驱动程序使用的算法的加密攻击。当前未分类的文献中尚不提供有关如何执行此操作的知识,但从理论上讲,可能存在这种攻击。如果您的应用程序中有此问题,请改用/ dev / random。

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

根据经验,没有专门的昂贵硬件从例如量子事件中收集数据,就没有真正的随机数生成器(即生成真正不可预测数的RNG)之类的东西。尽管出于加密目的,/ dev / random或/ dev / urandom就足够了(使用的方法用于CPRNG加密伪随机数生成器)。

熵池和/ dev / random的阻塞读取被用作安全措施,以确保无法预测随机数;例如,如果攻击者用尽了系统的熵池,则有可能(尽管对于当今的技术而言这不太可能),他可以预测/ dev / urandom的输出,该输出已经很长时间没有被重新播种(尽管这样做这还需要攻击者耗尽系统收集更多熵的能力,这在天文学上也是不可能的)。


1
@Lie,那么OS会将/dev/random位存储在哪里?这些存储的位数有限制吗?
Pacerier 2014年

@Pacerier,所述random.c手册页和对应的源极被很好的注释和挺有意思:git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/...
ijustlovemath

@LieRyan您提到的是经验法则。您能为此建议任何可靠的来源吗?
罗密欧·塞拉

31

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

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

通常的Linux发行版在关闭时会保存从那里获得的随机种子/dev/urandom,并在下次启动时将其注入回来,从而保证了所提供的随机质量/dev/urandom。仅在OS安装期间,密码质量才成为问题,通常不是因为安装涉及与执行安装的人员之间的许多交互,从而产生了成群的熵。

总结一下,在Linux和FreeBSD上,都应该使用/dev/urandom,而不是/dev/random


考虑到/ dev / random的安全性不如/ dev / urandom,是否不能因为最初的种子依赖/ dev / random而提出这种安全性较低的方法?
monokrome

2
没有的/ dev / urandom的是小于安全的/ dev / urandom的,因为当它超出熵的/ dev / urandom的不阻塞
黛咪

8
@Demetri —您刚刚说过/ dev / urandom不如其本身安全。
托德·雷曼

1
@ToddLehman抱歉,我的意思是/ dev / random(从理论上来说)更安全。
黛米2014年

2
现在,Linuxgetrandom为此有一个系统调用。:)
Scott Arciszewski 2015年

8

在这里报价

/dev/random将在熵池耗尽后阻塞。在从可用的熵源中收集到其他数据之前,它将一直处于阻塞状态。这会减慢随机数据的生成。

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


/dev/urandom 在以下情况下最好使用:

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

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

  • 随机性对于应用程序中密码安全性至关重要-一次性填充,密钥生成。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.