关于/dev/urandom 的流言终结(2)
因为我们使用的几乎所有的算法都并不是信息论安全性的。它们“只能”提供计算意义上的安全。我能想到为数不多的例外就只有 Shamir 密钥分享和一次性密码本(OTP)算法。并且就算前者是名副其实的(如果你实际打算用的话),后者则毫无可行性可言。 但所有那些大名鼎鼎的密码学算法,AES、RSA、Diffie-Hellman、椭圆曲线,还有所有那些加密软件包,OpenSSL、GnuTLS、Keyczar、你的操作系统的加密 API,都仅仅是计算意义上安全的。 那区别是什么呢?信息论安全的算法肯定是安全的,绝对是,其它那些的算法都可能在理论上被拥有无限计算力的穷举破解。我们依然愉快地使用它们是因为全世界的计算机加起来都不可能在宇宙年龄的时间里破解,至少现在是这样。而这就是我们文章里说的“不安全”。 除非哪个聪明的家伙破解了算法本身 —— 在只需要更少量计算力、在今天可实现的计算力的情况下。这也是每个密码学家梦寐以求的圣杯:破解 AES 本身、破解 RSA 本身等等。 所以现在我们来到了更底层的东西:随机数生成器,你坚持要“真随机”而不是“伪随机”。但是没过一会儿你的真随机数就被喂进了你极为鄙视的伪随机算法里了! 真相是,如果我们最先进的哈希算法被破解了,或者最先进的分组加密算法被破解了,你得到的这些“哲学上不安全”的随机数甚至无所谓了,因为反正你也没有安全的应用方法了。 所以把计算性上安全的随机数喂给你的仅仅是计算性上安全的算法就可以了,换而言之,用 Linux 随机数生成器的构架一种错误的看法你对内核的随机数生成器的理解很可能是像这样的: image: mythical structure of the kernel's random number generator “真正的随机性”,尽管可能有点瑕疵,进入操作系统然后它的熵立刻被加入内部熵计数器。然后经过“矫偏”和“漂白”之后它进入内核的熵池,然后 “真”随机数生成器, 这里很重要一环是 而对 在这种对随机数生成的理解下,很多人会觉得在 Linux 下尽量避免 因为要么你有足够多的熵,你会相当于用了 看上去很邪恶是吧?很不幸的是这种看法是完全错误的。实际上,随机数生成器的构架更像是下面这样的。 更好地简化Linux 4.8 之前image: actual structure of the kernel's random number generator before Linux 4.8 你看到最大的区别了吗?CSPRNG 并不是和随机数生成器一起跑的,它在 另外一个重要的区别是这里没有熵计数器的任何事情,只有预估。一个源给你的熵的量并不是什么很明确能直接得到的数字。你得预估它。注意,如果你太乐观地预估了它,那
(编辑:ASP站长网) |