我一直在阅读关于 /dev/urandom
的内容,据我所知,/dev/random
利用网络数据包时序等多个事件来生成密码学随机数。然而,我是否正确理解了 /dev/urandom
使用 PRNG,并使用从 /dev/random
中获取的种子数?还是说只要有位元,它就会一直使用 /dev/random
-- 当位元用尽时,它会从何处收集的种子转向某些 PRNG 呢?
我一直在阅读关于 /dev/urandom
的内容,据我所知,/dev/random
利用网络数据包时序等多个事件来生成密码学随机数。然而,我是否正确理解了 /dev/urandom
使用 PRNG,并使用从 /dev/random
中获取的种子数?还是说只要有位元,它就会一直使用 /dev/random
-- 当位元用尽时,它会从何处收集的种子转向某些 PRNG 呢?
urandom
手册中:/dev/random的熵池和阻塞读操作被用作安全措施,以确保无法预测随机数;例如,如果攻击者耗尽了系统的熵池,虽然在今天的技术水平下高度不可能,但他仍可能预测长时间未重新种子化的/dev/urandom的输出(但这也需要攻击者耗尽系统收集更多熵的能力,这也是极其不可能的)。
/dev/urandom
提供的功能:它将从/dev/random
读取足够长度的初始种子,然后使用PRNG。因此,它可能会在最初阻塞(就在系统启动后),但一旦收集到足够的熵,它就不会再阻塞。这提供了大多数加密协议所需的随机性水平,同时不会过度阻塞。
Linux的/dev/urandom
类似,只是它永远不会阻塞,因此如果在启动后立即使用它,则可能会冒返回低质量随机数的风险。另一方面,/dev/random
可能会在启动后很长一段时间内一直阻塞,这也是一个问题。我经常看到服务器神秘地停止工作,因为某些软件坚持使用/dev/random
,而没有键盘的服务器无法获取足够的熵。
通常的Linux发行版在关机时保存从/dev/urandom
获取的随机种子,并在下次启动时重新注入,从而保证了由/dev/urandom
提供的随机数的质量。只有在安装操作系统时,加密质量才成为一个问题,通常这不是因为安装涉及多次与执行安装的人类进行交互,产生了大量的熵。
总之,在Linux和FreeBSD下,您应该使用/dev/urandom
而不是/dev/random
。
引用这里:
/dev/random
在熵池耗尽后会阻塞。它会一直阻塞,直到可以从可用的熵源收集到更多数据。这可能会减慢随机数据生成的速度。
/dev/urandom
不会阻塞。相反,它将重用内部池来产生更多伪随机位。
当:
dd
命令通过替换为随机数据来抹掉磁盘上的数据。/dev/random
。当:
/dev/random
的位?它们存储这些位的数量是否有限制? - Pacerier