有没有办法提供/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_entropyd
、audio-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 设计,因为它是一个记录良好的设计,并且易于与现有系统集成。请记住,它必须在没有优化的情况下进行编译以获得最大熵结果。