有时我需要大量高度随机的数据,例如覆盖文件甚至整个硬盘。我应该使用/dev/random
或者/dev/urandom
? 每种方法的优点和缺点是什么?有没有更好的选择?
答案1
对于大量数据,您需要使用/dev/urandom
。u
代表“无限”,意味着始终有可用数据。如果您尝试从 读取大量数据/dev/random
,它将被阻塞,从而使您的程序暂时无法继续运行。
两个都/dev/random
和/dev/urandom
提供不可预测的(随机)数据。来自的数据/dev/random
旨在完全地不可预测(或真正随机),使其适用于长期加密密钥(未来的攻击者可能利用广泛的研究和更快的计算机来尝试破解用于生成数据的算法)。来自的数据/dev/urandom
基于真正的随机数据,但可以通过高质量的伪随机函数来生成额外的数据。它仍然适用于诸如加密密钥之类的东西,只要你不需要确保它们几十年内不会被破解,但也可以用于批量数据。
Linux 内核维护着一个由不可预测数据组成的“熵池”,其中每个位都有相同的几率为真或假(一或零)。内核从各种输入(例如硬件源、驱动程序、用户操作以及任何其他无法可靠预测的内容)构建此熵池。但是,这些源需要时间来积累熵,因此如果熵池消耗得太快,熵池可能会耗尽。
/dev/random
直接从熵池中抽取。当池耗尽时,从中读取/dev/random
不会返回任何数据,直到池重新填充足够多的数据,这可能需要相当长的时间。/dev/urandom
使用密码安全的伪随机数生成器(CSPRNG)从熵池中播种。它可以生成无限量的输出,但如果不知道 CSPRNG 的内部状态,就无法预测输出。由于内部状态最初基于真正随机的数据,并且所使用的 CSPRNG 算法设计为不会通过其输出泄露其内部状态,因此它/dev/urandom
仍然是高度随机数据的良好来源。
总结一下,当你需要最大限度地随机数据,使用/dev/random
。但是,如果您需要大量数据,则需要使用/dev/urandom
。一般来说,/dev/urandom
除非您需要数据在未来几十年内与真正的随机噪声难以区分,否则请使用 。