首先,直接回答你的问题:这是做不到的。这是故意不允许的。
实际上,您可以写入 /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。