添加一个文件作为 /dev/random 的熵源

信息安全 linux 随机的
2021-08-26 07:43:19

我所拥有的:一个包含大量秘密、真正随机字节的大文件(是的,我确信它们不仅仅是伪随机字节)。我称它为F。

我想要做什么:告诉 Linux 它可以使用这个文件作为熵源/dev/random(每个字节应该估计为完整的 8 位熵)

我已经知道并且不想被讲授的内容

  • /dev/urandom
  • 用于从系统中的其他设备收集熵的现有工具

我在找什么:一个shell命令或一个工具(和相关函数)的名称,它们将:

  • 将 F 附加到 /dev/random
  • 导致访问/dev/random从 F 消耗字节,就好像它是一个设备一样,而不重用任何

这可能吗?有哪些安全隐患?

4个回答

首先,直接回答你的问题:这是做不到的。这是故意不允许的。

实际上,您可以写入 /dev/random,它会将您的输入混合到随机池中,从而可能提高输出的质量。但它不会更新 entropy_count 并解锁 /dev/random 以供阅读,因为那会作弊否则,您将能够执行以下操作:

cat /dev/urandom > /dev/random  # Sup dawg, I heard you like random pools...

除了你可以。有点。

/dev/random 上有一个名为RNDADDENTROPYavailable 的 ioctl,它更新熵池,然后相应地增加 entropy_count。这个想法是允许您从用户空间中的硬件 RNG 读取并将其转储到内核池中,而无需编写自己的驱动程序。漂亮。虽然任何人都可以将他们的熵转储到 /dev/random 中(这不会造成伤害),但只允许 root 使用RNDADDENTROPY.

是的,有一个工具可以让您相对轻松地做到这一点;它被称为rngd它的主要目的是读取类似 RNG的指令/dev/hwrandom或处理器的RDRAND指令,并在熵池变低时不断重新播种。但是它需要一个任意的文件名作为输入,所以是的,你甚至可以这样做:

rngd -r /dev/urandom

老实说,这与这样做并没有完全不同:

ln -sf /dev/urandom /dev/random

但正如我最初所说,这并不意味着您可以使用此工具使内核使用您的文件作为其熵的来源。至少,那一点是不允许的。您可以将它用作与所有其他熵混合的额外熵源,但不是唯一的熵源。

如果您确信您的文件具有高级随机性,那么就使用它。您不必通过内核的熵估计系统注入它。相反,如果你有一个生成 TRNG 的机制,那么一定要把它和所有其余的熵源一起转储到那里;rngd这很简单。

我不会费心告诉你在真实服务器上虔诚地避免 /dev/urandom 是完全荒谬的,因为很明显你已经听过几次演讲并选择不听。

但是对于其他所有人来说,/dev/random 和 /dev/urandom 之间的区别仅在没有合理随机源的设备(如某些嵌入式设备)上启动时立即重要,其中启动条件可精确重复,随机池在哪里没有在靴子之间保存。在所有其他情况下,对 /dev/urandom 的任何理论上的攻击都需要实际上不存在的技术和技术,并且预计永远不会存在。

从您问题的措辞来看,您似乎认为 /dev/random 输出 TRNG 的结果,而 /dev/urandom 使用 PRNG。这是不准确的。输出的唯一区别是,random如果它生成字节的速度比观察随机事件的速度快,它将“锁定”,而urandom不会。否则,它们都在各自的池上运行完全相同的代码。两者都不会直接从 TRNG 输出原始位。两者都使用随机事件来不断地重新播种 PRNG。

鉴于您所说的一切,您可能应该直接从文件中读取,而不是从 /dev/random 中读取。由于您显然不相信 /dev/random 的工作原理(也许您阅读了这篇论文),所以请声明性,不要相信它。

您现在应该意识到,不允许任何人将数据直接注入熵池。否则,这将是一个可能危及 SSL/TLS 密钥生成的攻击媒介,并且所有坏人都已经在这样做了。

如果您坚持向前推进,请查看 rng-tools 如何将数据插入熵池。它旨在集成硬件 RNG 的输出,您可以将其修改为从文件中读取,而不是从硬件设备中读取。我担心的是,即使您从文件中提供了足够的数据,如果 /dev/random 没有从其他来源获得足够的熵,它也可能会阻塞。它不应该从单一来源获取所有熵位,因此无论您以多快的速度提供它们,我认为它可能会阻塞。

如果您使用实际的硬件随机数生成器来创建文件,我会考虑使用 rng-tools 将其直接绑定到熵池中,而无需将其提交到文件系统的中间步骤。

这种方法的好处是它降低了文件对随机数造成破坏性影响的风险(数据与其他熵源混合),并且降低了攻击者复制文件和学习随机数的风险(由于熵的其他来源)。

在大多数 Linux 系统上,/dev/random使用的熵池在启动时使用/var/run/random-seed. 如果省略此过程,则使用相同 Linux 发行版的两个相同服务器可能具有相同的引导顺序,因此将具有相同的 /dev/random 状态。

为了防止这种情况发生,在关闭时/dev/random熵池的当前值被保存到/var/run/random-seed中,然后在启动时恢复。让每个人的熵池都有些不同,这是一个很棒的设计。

增加内核的熵计数器需要RNDADDENTROPYioctl。

调用它的最简单方法是使用包中rngd守护进程rng-tools

rngd -r /path/to/F

(注意:rngd预计这是一个硬件设备,所以当它到达文件末尾时,它会抱怨熵源不再工作。)