我/dev/urandom
用来为我的程序生成随机数据。我了解到它/dev/random
可以为空,因为与 不同/dev/urandom
的是,当生成的字节数不足时,它不使用 SHA。/dev/random
使用“内核熵池”。显然,它依赖于键盘计时、鼠标移动和 IDE 计时。
但这真的有效吗?
难道不能“喂”熵池使 /dev/random 输出可预测吗?
您所说的是正确的,是的,理论上可以将熵输入/dev/random
,但是您需要控制很多内核“噪声”源才能使其变得重要。您可以查看random.c的来源,以了解从何处/dev/random
拾取噪声。基本上,如果您控制了大量噪声源,那么您可以猜测其他噪声源对熵池的贡献。
由于/dev/urandom
是从 播种的哈希链/dev/random
,因此如果您知道种子,您实际上可以预测下一个数字。如果您对熵池有足够的控制权,那么从您的输出中/dev/urandom
可能能够猜出这个种子,这将使您能够预测 中的所有下一个数字/dev/urandom
,但前提是您保持/dev/random
筋疲力尽,否则/dev/urandom
将被重新播种。
话虽如此,我还没有看到任何人真正做到这一点,即使在受控环境中也是如此。当然,这不是保证,但我不会担心。
所以我宁愿使用/dev/urandom
并保证我的程序在等待熵时不会阻塞,而不是使用/dev/random
并要求用户做一些愚蠢的事情,比如移动鼠标或敲击键盘。
我认为您应该阅读LWN 的关于熵和随机性,希望它可以平息您的担忧 :-)。
如果您仍然担心,那就给自己买一个HRNG。
编辑 这是关于熵的一个小注释:
我认为熵的概念通常很难掌握。在Wikipedia上有一篇包含更多信息的文章。但基本上,在这种情况下,您可以将熵理解为随机性。
所以我怎么看,你有一大袋彩色球,这个袋子里的熵越高,就越难预测从袋子里抽出的下一个颜色。
在这种情况下,您的熵池只是一堆随机字节,其中一个不能从前一个或任何其他字节派生而来。这意味着你有高熵。
我很欣赏 jbr 回答的深度。
为当前盯着 ipsec pki 命令或类似阻塞空熵池的任何人添加实用更新:
我刚刚在另一个窗口中安装了 rng-tools 并且我的 pki 命令完成了。
apt-get install rng-tools
我正在阅读 factorable的一篇论文, 并记下了它说的部分:
“对于库开发人员:默认为最安全的配置。两者都
OpenSSL
默认Dropbear
使用/dev/urandom
而不是/dev/random
,并且Dropbear
默认使用不太安全的 DSA 签名随机技术,即使可以选择更安全的技术。”
作者解决了应用程序挂起的权衡,同时等待熵构建/dev/random
以获得更好的安全性,而不是快速但不太安全的结果/dev/urandom
。
一些附加信息:
IRQF_SAMPLE_RANDOM:此中断标志指定设备生成的中断应有助于内核熵池
中断是鼠标、键盘等(设备)异步发送的设备。