39

/dev/urandom用来为我的程序生成随机数据。我了解到它/dev/random可以为空,因为与 不同/dev/urandom的是,当生成的字节数不足时,它不使用 SHA。/dev/random使用“内核熵池”。显然,它依赖于键盘计时、鼠标移动和 IDE 计时。

但这真的有效吗?
难道不能“喂”熵池使 /dev/random 输出可预测吗?

4

4 回答 4

31

您所说的是正确的,是的,理论上可以将熵输入/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上有一篇包含更多信息的文章。但基本上,在这种情况下,您可以将熵理解为随机性。

所以我怎么看,你有一大袋彩色球,这个袋子里的熵越高,就越难预测从袋子里抽出的下一个颜色。

在这种情况下,您的熵池只是一堆随机字节,其中一个不能从前一个或任何其他字节派生而来。这意味着你有高熵。

于 2013-11-14T19:56:45.337 回答
5

我很欣赏 jbr 回答的深度。

为当前盯着 ipsec pki 命令或类似阻塞空熵池的任何人添加实用更新:

我刚刚在另一个窗口中安装了 rng-tools 并且我的 pki 命令完成了。

apt-get install rng-tools
于 2015-12-01T23:32:55.047 回答
2

我正在阅读 factorable的一篇论文, 并记下了它说的部分:

“对于库开发人员:默认为最安全的配置。两者都OpenSSL 默认Dropbear使用/dev/urandom而不是 /dev/random,并且Dropbear默认使用不太安全的 DSA 签名随机技术,即使可以选择更安全的技术。”

作者解决了应用程序挂起的权衡,同时等待熵构建/dev/random以获得更好的安全性,而不是快速但不太安全的结果/dev/urandom

于 2016-07-12T19:51:59.143 回答
0

一些附加信息:

IRQF_SAMPLE_RANDOM:此中断标志指定设备生成的中断应有助于内核熵池

中断是鼠标、键盘等(设备)异步发送的设备。

于 2021-09-16T05:14:49.170 回答