2013-11-14 33 views
26

我使用/dev/urandom为我的程序生成随机数据。我了解到/dev/random可以为空,因为与/dev/urandom不同,它不会在没有足够的字节生成时使用SHA。 /dev/random使用“内核熵池”。显然它依赖于键盘时序,鼠标移动和IDE时序。内核熵池如何工作?

但是,这是如何工作的?
难道不可能“喂养”使得/ dev/random输出可预测的熵池吗?

+0

Imho你应该替换其中一个标签来提到这个问题是针对linux的;无论如何,关于第二部分 - 不,只有root可以做到这一点,普通用户只能混合使用新数据,这是无害的。 – loreb

回答

20

你说的是现货,理论上是可以将熵输入/dev/random,但是你需要控制很多内核“噪音”来源,因为它很重要。您可以查看random.c的来源,以查看/dev/random从哪里拾取噪音。基本上,如果你控制了大量的噪声源,那么你可以猜测其他人对熵池的贡献。

由于/dev/urandomHash chain种子从/dev/random,那么你可以真正预测下一个数字,如果你知道种子。如果您对熵池有足够的控制权,那么从/dev/urandom的输出中,您可能会猜出此种子,这将使您能够预测/dev/urandom中的所有下一个数字,但只有当您保持/dev/random用尽时,否则/dev/urandom将会补种。

这就是说,我还没有看到有人真的这样做,即使在一个受控制的环境中。当然这不是保证,但我不担心。

因此,我宁愿使用/dev/urandom,并保证我的程序在等待熵时不会阻止,而是使用/dev/random并要求用户执行愚蠢的操作,例如移动鼠标或在键盘上敲击。

我认为你应该从LWN读取On entropy and randomness,希望它能平息你的担忧:-)。

如果你仍然担心,那么自己去找一个HRNG

编辑 这里是熵小记:

我认为熵的概念一般是难以把握。有关于Wikipedia的更多信息的文章。但基本上,在这种情况下,您可以将熵视为随机性。

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

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

+0

谢谢你这个非常好的答案。 作为非英语母语的人,“熵”这个词有点难以获得。 我把熵池描绘成一个内存数组,当它填充8/16位时,打印相应的符号,对吗? – Antoninarto

+0

我在熵上添加了一个小记录。希望这会让你的事情变得更清晰。 – jbr

2

我很欣赏jbr的答案的深度。

添加一个实用的更新目前任何人都盯着空了熵游泳池的安全PKI命令或类似的东西阻塞:

我刚装RNG-工具在另一个窗口,我的PKI命令完成。

apt-get install rng-tools 
0

我是在 factorable 阅读纸质之中,并留意了,它说的部分:

“对于库的开发者: 默认为最安全的配置都OpenSSLDropbear默认使用/dev/urandom而不是 /dev/randomDropbear默认使用不太安全的 DSA签名随机性技术,即使 更安全的技术可作为选项。“

作者解决的一个应用程序,同时等待熵建立/dev/random相比,快速获得更好的安全挂的权衡,但安全性较差,从/dev/urandom结果。

+0

难道是因为有两次'/ dev/random',所以在最后一句中有任何一种错误。 –

+0

好,凯文。 第二次发生应该是/ dev/urandom。 /dev/urandom立即返回结果,而不管目前的熵是否为 。 /dev/random会在提供 结果之前等待/挂起一个合适的熵级别。 – Mike

+0

既然它们不会因为熵耗尽而阻塞,那么你是否理论上可以通过自己使用它(没有根)来“吸取”熵,并且为加密程序留下更少的熵(或者除虚拟以外的熵)? –