我不太明白Linux 系统上的/dev/random
和之间的区别。/dev/urandom
“熵”耗尽意味着什么以及系统如何获得更多熵?
/dev/random
如果熵不够,人们说“阻塞”是什么意思?
在什么场景下我应该使用哪一个?
答案1
随机性意味着您获得的下一个值与前一个值无关,并且您无法预测它。
这对于计算机来说实际上很难做到,因为计算机基本上只是一个非常快速的计算器 - 所以它可以进行数学运算,但每次都会得到准确的答案。你可以用数学来做一些接近随机的事情,称为“伪随机性” - 但它的质量不够高,不能用于加密。
因此,Linux 从各种来源(例如输入事件之间的时间)收集池中的“随机性”。此池中的随机性“量”就是熵。熵越少 = 规则、重复、可预测的模式越少 - 您需要尽可能多的熵。当熵变低时,Linux 内核会用熵“填充”其池,但这取决于系统上发生的情况,因为它使用不可预测的硬件事件之间的时间来生成熵。
如果游泳池是空的,/dev/random
将堵塞,或者停止提供数据,直到内核获得足够的熵。
/dev/urandom
将继续——使用伪随机技术生成随机数。
现在你已经掌握了基础知识,你可以随时使用 urandom 和原因如下。
以下是该文章的摘录,解释了为什么这并不重要:
但让我们假设你已经获得了这些“真正的”随机数。你要用它们做什么呢?
你把它们打印出来,装裱起来,挂在客厅的墙上,陶醉于量子宇宙的美丽?这很好,我当然理解。
等等,什么?你要用它们?用于加密目的?好吧,这把一切都搞砸了,因为现在事情变得有点糟糕了。
你看,真正随机的、量子效应祝福的随机数被放入一些不太受尊重的、现实世界中被玷污的算法中。
因为几乎所有我们使用的加密算法都不符合信息理论安全性。它们“仅”提供计算安全性。我想到的两个例外是 Shamir 的秘密共享和一次性密码本。虽然第一个可能是一个有效的反驳(如果你真的打算使用它),但后者完全不切实际。
但是您所知道的所有算法,aes、rsa、Diffie-Hellman、椭圆曲线,以及您所使用的所有加密包,OpenSSL、GnuTLS、Keyczar、您的操作系统的加密 API,这些都只是计算安全的。
有什么区别?虽然信息理论安全算法是安全的,但其他算法无法保证在对手拥有无限计算能力并尝试所有密钥可能性的情况下也能保证安全。我们仍然使用它们,因为全世界所有计算机加起来需要的时间比宇宙存在的时间还要长。这就是我们在这里谈论的“不安全”程度。
除非有聪明人破解算法本身,而这需要的计算能力要少得多。即使是今天可以实现的计算能力。这是每个密码分析员梦寐以求的大奖:破解 aes 本身、破解 rsa 本身等等。
所以现在我们处于这样一个阶段:你不信任随机数生成器的内部构造块,坚持“真随机性”而不是“伪随机性”。但你却在算法中使用了那些“真”随机数,而你非常鄙视这些算法,以至于你一开始就不想让它们靠近你的随机数生成器!
事实是,当最先进的哈希算法被破解时,或者当最先进的分组密码被破解时,你因此获得“哲学上不安全”的随机数并不重要。无论如何,你都没有什么可以安全地使用它们了。
因此,只需将这些计算安全的随机数用于计算安全的算法即可。换句话说:使用 /dev/urandom。