内核熵池如何工作?

Ant*_*rto 31 linux random entropy

我正在使用/dev/urandom为我的程序生成随机数据.我知道它/dev/random可以是空的,因为不同的是/dev/urandom,当没有足够的字节生成时它不使用SHA./dev/random使用" 内核熵池 ".显然它依赖于键盘计时,鼠标移动和IDE计时.

但这如何真正起作用?
并且不可能"提供"熵池使/ dev/random输出可预测吗?

jbr*_*jbr 24

你所说的是现实,是的,理论上可以提供熵/dev/random,但是你需要控制很多内核"噪声"来源,因为它很重要.你可以查看random.c的源代码,看看/dev/random从哪里获取噪音.基本上,如果您控制了大量的噪声源,那么您可以猜测其他噪声源对熵池的贡献.

既然/dev/urandom是一个种子的哈希链/dev/random,那么你可以实际预测下一个数字,如果你知道种子.如果您对熵池有足够的控制权,那么从/dev/urandom您的输出中可能能够猜出这个种子,这将使您能够预测所有下一个数字/dev/urandom,但前提是您/dev/random已经筋疲力尽,否则/dev/urandom将重新播种.

话虽如此,我还没有看到任何人真正这样做,即使在受控制的环境中也是如此.当然这不是保证,但我不担心.

所以我宁愿使用/dev/urandom并保证我的程序在等待熵时不会阻塞,而不是使用/dev/random并要求用户做傻事,比如移动鼠标或敲击键盘.

我想你应该阅读LWN的熵和随机性,希望它可以平息你的担忧:-).

如果您仍然担心,那么请自己做一个HRNG.

编辑 这是关于熵的小注释:

我认为熵的概念通常很难掌握.有一篇文章提供有关维基百科的更多信息.但基本上,在这种情况下,您可以将熵视为随机性.

所以我怎么看,就是你有一大袋彩球,这个包中的熵越高,就越难以预测从包里取出的下一个颜色.

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

  • 谢谢你这个非常好的答案。作为非英语母语人士,“熵”这个词对我来说有点难。我把熵池想象成一个内存数组,当它充满 8/16 位时,打印相应的符号,对吗? (2认同)

jor*_*fus 5

我很欣赏 jbr 回答的深度。

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

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

apt-get install rng-tools
Run Code Online (Sandbox Code Playgroud)