为 /dev/random 提供磁盘读取等

为 /dev/random 提供磁盘读取等

有没有办法提供/dev/random足够的熵?数据不必是真正随机的,即我可以附加一天中的时间与 pid 并向其添加 27,这并不重要,我只是想让它运行得更快。

我试图让球滚动起来dd if=/dev/zero of=/dev/null。我想知道是否有某种方法可以用来add_keystroke_randomness人工/linux/random.h喂养,/dev/random这样我就不会收到那些不可预测的阻塞呼叫。即我愿意牺牲一些随机性来换取速度。

PS - 请不要建议使用/dev/urandom

答案1

产生熵有多种解决方案。例如haveged(我对自己非常满意)、timer_entropydaudio-entropyd等等。对于大多数使用 的应用程序来说,它们通常会产生足够的熵/dev/random。如果您想全力以赴,还有硬件随机生成器(以 USB 棒形式提供)。尽管它们产生的熵可能比你想象的要少......

尽管如此,/dev/urandom当您需要立即提供数据时,这始终是一个不错的选择。

对于大量数据(例如覆盖硬盘),无论可用的熵如何,随机设备在速度方面都不适合;像这样基于 PRNG 的解决方案确实shred可以更好/更快地完成它。

答案2

(我的答案适用于 Linux。一般原则适用于其他 UNIX 变体,但不适用于random/urandom区别。)

这已经在内核内部发生了。

注入额外的熵总是没有坏处的。如果你有一堆伪随机字节,只需将它们写入/dev/random,它们就会混合到熵池中。

哈韦格是一个收集额外熵的流行程序。

dd if=/dev/zero of=/dev/null不会引起任何硬件 I/O,因此不会增加任何熵。击键包含少量的熵。


请注意,如果您在 Linux 下阅读/dev/random,那么您就做错了。 Linux 设计者搞错了:他们宣称熵是一种很快就会耗尽的东西,这事实并非如此。解决“阻塞”的办法/dev/random不是“注入更多的熵”,而是“使用适当的设备”。不管你想不想听,你应该阅读/dev/urandom

答案3

根据内核版本,Linux 将add_disk_randomness()add_input_randomness()、 和add_interrupt_randomness()作为熵源实现。这些事件对应于磁盘 I/O 事件、键盘和鼠标事件以及中断 (IRQ) 事件。确切的实现请参见 random.c。这些源在内部进行调节、混合和存储,并用于为阻塞/dev/random和非阻塞/dev/urandom驱动程序提供数据。在这种情况下,非阻塞意味着/dev/urandom即使熵池不包含熵,调用也始终会产生输出。尽管不太可能,但/dev/urandom使用可以导致低熵种子和可预测的确定性 RNG。这反过来又可能导致加密被破坏,RSA 特别容易受到低熵条件的影响。所以你不应该用于/dev/urandom加密。然而,启动时间/dev/urandom熵在无头系统上始终存在问题,并且需要额外的熵源才能正确运行。

解决启动熵不足的最简单方法是启用RdRand(或RdSeed)via hw_rand,但这需要信任 Intel(现在是 AMD)黑盒实现。如果您碰巧使用 QorlQ,则有等效的 SEC 功能。

或者,您可以实现软件真(?)随机数生成器。我的建议是CPU时间抖动由 Stephan Muller 设计,因为它是一个记录良好的设计,并且易于与现有系统集成。请记住,它必须在没有优化的情况下进行编译以获得最大熵结果。

相关内容