我一直在阅读/dev/urandom
,据我所知,我/dev/random
利用网络数据包定时等事件创建了密码随机数。但是,我是否理解/dev/urandom
使用PRNG并从中植入数字的权利/dev/random
?还是/dev/random
只要有一点就使用它-当它们用完时会回落到PRNG并从哪里收集种子?
Answers:
从urandom
联机帮助页:
随机数发生器将来自设备驱动程序和其他来源的环境噪声收集到一个熵池中。发生器还保持熵池中噪声位数的估计。根据该熵池,创建随机数。
读取时,/ dev / random设备将仅返回熵池中估计的噪声位数内的随机字节。/ dev / random应该适合需要高质量随机性的用途,例如一次性填充或密钥生成。 当熵池为空时,从/ dev / random的读取将被阻塞,直到收集到其他环境噪声为止。
从/ dev / urandom设备进行的读取不会阻止等待更多熵。结果,如果在熵池中没有足够的熵,则返回值在理论上容易受到对驱动程序使用的算法的加密攻击。当前未分类的文献中尚不提供有关如何执行此操作的知识,但从理论上讲,可能存在这种攻击。如果您的应用程序中有此问题,请改用/ dev / random。
两者都使用PRNG,尽管使用环境数据和熵池在天文上使破解PRNG更加困难,并且在不收集完全相同的环境数据的情况下也是不可能的。
根据经验,没有专门的昂贵硬件从例如量子事件中收集数据,就没有真正的随机数生成器(即生成真正不可预测数的RNG)之类的东西。尽管出于加密目的,/ dev / random或/ dev / urandom就足够了(使用的方法用于CPRNG加密伪随机数生成器)。
熵池和/ dev / random的阻塞读取被用作安全措施,以确保无法预测随机数;例如,如果攻击者用尽了系统的熵池,则有可能(尽管对于当今的技术而言这不太可能),他可以预测/ dev / urandom的输出,该输出已经很长时间没有被重新播种(尽管这样做这还需要攻击者耗尽系统收集更多熵的能力,这在天文学上也是不可能的)。
实际上,实际上您需要的是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
。
getrandom
为此有一个系统调用。:)
/dev/random
位存储在哪里?这些存储的位数有限制吗?