【问题标题】:How does the kernel entropy pool work?内核熵池是如何工作的?
【发布时间】:2013-11-14 15:08:40
【问题描述】:

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

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

【问题讨论】:

  • 恕我直言,您应该替换其中一个标签以提及此问题是特定于 linux 的;无论如何,关于第二部分——不,只有 root 可以这样做,普通用户只能混入新数据,这是无害的。
  • 这个问题是如何针对 Linux 的?包括 macOS 在内的 BSD 变体也有 /dev/random/dev/urandom

标签: linux random entropy


【解决方案1】:

您所说的是正确的,是的,理论上可以将熵输入/dev/random,但是您需要控制很多内核“噪声”源才能使其变得重要。您可以查看random.c 的来源,以了解/dev/random 从何处获取噪音。基本上,如果你控制了大量的噪声源,那么你就可以猜出其他噪声源对熵池的贡献。

由于/dev/urandom 是从/dev/random 播种的Hash chain,因此如果您知道种子,您实际上可以预测下一个数字。如果您对熵池有足够的控制权,那么从/dev/urandom 的输出中您可能能够猜到这个种子,这将使您能够预测来自/dev/urandom 的所有下一个数字,但前提是您保留/dev/random用尽,否则/dev/urandom 将被重新播种。

话虽如此,我还没有看到有人真正做到这一点,即使是在受控环境中也是如此。当然这不是保证,但我不会担心。

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

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

如果你仍然担心,那就给自己一个HRNG

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

我认为熵的概念通常很难掌握。在Wikipedia 上有一篇文章提供了更多信息。但基本上,在这种情况下,您可以将熵理解为随机性。

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

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

【讨论】:

  • 感谢您提供这个非常好的答案。作为一个非英语为母语的人,“熵”这个词对我来说有点难以理解。我将熵池想象成一个内存数组,当它填充 8/16 位时,会打印相应的符号,对吗?
  • 我添加了一个关于熵的小注释。希望这能让你更清楚一点。
【解决方案2】:

我很欣赏 jbr 回答的深度。

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

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

apt-get install rng-tools

【讨论】:

    【解决方案3】:

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

    “对于库开发人员: 默认为最安全的配置。都OpenSSLDropbear 默认使用/dev/urandom 而不是 /dev/randomDropbear 默认使用安全性较低的 DSA 签名随机性技术,即使 可以选择更安全的技术。”

    作者解决了在等待熵构建 /dev/random 时应用程序挂起的权衡,以便与来自 /dev/urandom 的快速但不太安全的结果相比获得更好的安全性。

    【讨论】:

    • 会不会是你最后一句话有什么错误,因为有两次/dev/random
    • 很好,凯文。第二次出现应该是/dev/urandom。 /dev/urandom 立即返回结果,无论存在多少熵。 /dev/random 将在提供结果之前等待/挂起合适的熵水平。
    • 既然他们不会阻止熵耗尽,理论上你不能自己使用它(没有根)来“吸收”熵,并留下更少的熵(或者除了伪) 用于加密程序?
    【解决方案4】:

    一些附加信息:

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2022-10-14
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      相关资源
      最近更新 更多