我使用/dev/urandom
为我的程序生成随机数据。我了解到/dev/random
可以为空,因为与/dev/urandom
不同,它不会在没有足够的字节生成时使用SHA。 /dev/random
使用“内核熵池”。显然它依赖于键盘时序,鼠标移动和IDE时序。内核熵池如何工作?
但是,这是如何工作的?
难道不可能“喂养”使得/ dev/random输出可预测的熵池吗?
我使用/dev/urandom
为我的程序生成随机数据。我了解到/dev/random
可以为空,因为与/dev/urandom
不同,它不会在没有足够的字节生成时使用SHA。 /dev/random
使用“内核熵池”。显然它依赖于键盘时序,鼠标移动和IDE时序。内核熵池如何工作?
但是,这是如何工作的?
难道不可能“喂养”使得/ dev/random输出可预测的熵池吗?
你说的是现货,理论上是可以将熵输入/dev/random
,但是你需要控制很多内核“噪音”来源,因为它很重要。您可以查看random.c的来源,以查看/dev/random
从哪里拾取噪音。基本上,如果你控制了大量的噪声源,那么你可以猜测其他人对熵池的贡献。
由于/dev/urandom
是Hash chain种子从/dev/random
,那么你可以真正预测下一个数字,如果你知道种子。如果您对熵池有足够的控制权,那么从/dev/urandom
的输出中,您可能会猜出此种子,这将使您能够预测/dev/urandom
中的所有下一个数字,但只有当您保持/dev/random
用尽时,否则/dev/urandom
将会补种。
这就是说,我还没有看到有人真的这样做,即使在一个受控制的环境中。当然这不是保证,但我不担心。
因此,我宁愿使用/dev/urandom
,并保证我的程序在等待熵时不会阻止,而是使用/dev/random
并要求用户执行愚蠢的操作,例如移动鼠标或在键盘上敲击。
我认为你应该从LWN读取On entropy and randomness,希望它能平息你的担忧:-)。
如果你仍然担心,那么自己去找一个HRNG。
编辑 这里是熵小记:
我认为熵的概念一般是难以把握。有关于Wikipedia的更多信息的文章。但基本上,在这种情况下,您可以将熵视为随机性。
所以我怎么看它,就是你有一大袋彩球,这个袋子里的熵越高,预测袋子里下一个色彩的难度越大。
在这种情况下,您的熵池只是一堆随机字节,其中一个不能从前一个或其他任何字节派生。这意味着你有很高的熵。
谢谢你这个非常好的答案。 作为非英语母语的人,“熵”这个词有点难以获得。 我把熵池描绘成一个内存数组,当它填充8/16位时,打印相应的符号,对吗? – Antoninarto
我在熵上添加了一个小记录。希望这会让你的事情变得更清晰。 – jbr
我很欣赏jbr的答案的深度。
添加一个实用的更新目前任何人都盯着空了熵游泳池的安全PKI命令或类似的东西阻塞:
我刚装RNG-工具在另一个窗口,我的PKI命令完成。
apt-get install rng-tools
我是在 factorable 阅读纸质之中,并留意了,它说的部分:
“对于库的开发者: 默认为最安全的配置都
OpenSSL
和Dropbear
默认使用/dev/urandom
而不是/dev/random
和Dropbear
默认使用不太安全的 DSA签名随机性技术,即使 更安全的技术可作为选项。“
作者解决的一个应用程序,同时等待熵建立/dev/random
相比,快速获得更好的安全挂的权衡,但安全性较差,从/dev/urandom
结果。
难道是因为有两次'/ dev/random',所以在最后一句中有任何一种错误。 –
好,凯文。 第二次发生应该是/ dev/urandom。 /dev/urandom立即返回结果,而不管目前的熵是否为 。 /dev/random会在提供 结果之前等待/挂起一个合适的熵级别。 – Mike
既然它们不会因为熵耗尽而阻塞,那么你是否理论上可以通过自己使用它(没有根)来“吸取”熵,并且为加密程序留下更少的熵(或者除虚拟以外的熵)? –
Imho你应该替换其中一个标签来提到这个问题是针对linux的;无论如何,关于第二部分 - 不,只有root可以做到这一点,普通用户只能混合使用新数据,这是无害的。 – loreb