关于 /dev/urandom 的神话 (2014)

2026-05-14 1 阅读 signa11
有一些关于 /dev/urandom 和 /dev/random 的事情被一遍又一遍地重复。但它们仍然是错误的。 /dev/urandom 不安全。始终使用 /dev/random 进行加密。事实:/dev/urandom 是类 UNIX 系统上加密随机性的首选来源。 /dev/urandom 是一个伪随机数生成器,即 PRNG,而 /dev/random 是一个“真”随机数生成器。事实:/dev/urandom 和 /dev/random 都使用完全相同的 CSPRNG(加密安全伪随机数生成器)。它们仅在很少的方面有所不同,与“真正的”随机性无关。 /dev/random 无疑是密码学的更好选择。即使 /dev/urandom 相对安全,也没有理由选择后者。事实:/dev/random 有一个非常棘手的问题:它会阻塞。但这很好! /dev/random 给出的随机性与其池中的熵完全相同。 /dev/urandom 会给你不安全的随机数,即使它早已耗尽了熵。事实:不。即使不考虑可用性和用户随后的操纵等问题,熵“低”的问题也是一个稻草人。大约 256 位的熵足以在很长一段时间内获得计算上安全的数字。有趣的地方才刚刚开始:/dev/random 如何知道可以给出多少熵?敬请关注!但密码学家总是谈论不断的重新播种。这不与你最后的观点相矛盾吗?事实:你抓住了我!有点儿。确实,随机数生成器不断地使用系统可以获得的任何熵重新播种。但这还有(部分)其他原因。看,我并不是说注入熵是不好的。很好。我只是声称,当熵估计值较低时,阻塞是不好的。这一切都很好,但即使是 /dev/(u)random 的手册页也与你相矛盾!了解这件事的人真的同意你的观点吗?事实:不,确实不是。这似乎暗示 /dev/urandom 对于加密使用来说是不安全的,除非您真正理解所有加密术语。手册页确实建议在某些情况下使用 /dev/random (在我看来,这并没有什么坏处,但并不是绝对必要的),但它也建议 /dev/urandom 作为用于“正常”加密使用的设备。虽然求助于权威通常没什么值得骄傲的,但在密码问题上,你通常应该小心谨慎并尝试听取领域专家的意见。是的,很多专家都同意我的观点,即 /dev/urandom 是在类 UNIX 系统的加密环境中满足随机数需求的首选解决方案。显然,他们的观点影响了我的观点,而不是相反。很难相信,对吧?我肯定是错的!好吧,请继续阅读,让我尝试说服您。我试图将其排除在外,但我担心在我们真正解决所有这些问题之前,还有两个预备工作需要处理。也就是说,什么是随机性,或者更好的是:我在这里谈论的是哪种随机性?而且,更重要的是,我真的没有居高临下的意思。我写这篇文档是为了当这个讨论再次出现时可以指出一些事情。超过140个字符。无需一次又一次地重复自己。能够磨练写作和论点本身,使许多场所的许多讨论受益。我当然愿意听到不同的意见。我只是说仅仅说 /dev/urandom 不好是不够的。您需要找出您不同意的观点并与他们互动。你说我傻!坚决不!事实上,几年前我自己也曾相信 /dev/urandom 是不安全的。这是你和我几乎不得不相信的事情,因为所有那些在 Usenet、网络论坛和今天在 Twitter 上备受尊敬的人都告诉了我们。甚至手册页似乎也是这么说的。我们有什么资格驳斥他们关于“熵变低”的令人信服的论点?这种误解之所以如此猖獗,并不是因为人们很愚蠢,而是因为只要对密码学有一点了解(即对熵是什么有一些模糊的概念),就很容易相信它。直觉几乎迫使我们到那里。不幸的是,密码学中的直觉常常是错误的。所以它就在这里。真正的随机性 随机数“真正随机”是什么意思?我不想太深入地探讨这个问题,因为它很快就会变得哲学化。众所周知,讨论很快就会瓦解,因为每个人都可以谈论自己最喜欢的随机性模型,而无需关注其他任何人。或者甚至让自己被理解。我相信“真正随机性”的“黄金标准”是量子效应。观察光子穿过半透明镜。或不。观察一些放射性物质发射阿尔法粒子。当谈到世界的随机性时,这是我们最好的想法。其他人可能有理由相信这些影响并不是真正随机的。或者甚至认为世界上没有随机性