我想知道对于普通 Linux 用户来说,从安全的角度或任何其他相关的角度来看,/dev/random 中没有或几乎没有熵是否被认为是不好的。
编辑:我不需要生成随机数(我会使用 /dev/urandom ,甚至用于密码生成和磁盘加密)。只是为了好玩,我有一个 bash 脚本,它可以从 /dev/random 中生成随机字符串,当然,在玩了一会儿之后,我在 /dev/random 中没有熵并且它会阻塞。在 IRC 上,有人告诉我这样做是“不好的”,但没有给出任何理由。因为普通的 Linux 用户使用 /dev/random 自动生成随机的东西,这很糟糕吗?如果是,涉及哪些程序?
我还知道 /dev/random 中没有留下熵会使数字的生成具有确定性。但同样,我的计算机(普通 Linux 用户)需要真正的随机数吗?
编辑 2:我刚刚在大约 3 分钟内每秒监控 /dev/random 中的熵级别,其中我启动了 bash 脚本,该脚本使用熵在监控开始时生成一串随机字符。我已经制定了一个计划。我们可以看到,熵水平确实以某种方式振荡,因此我计算机上的某些程序正在使用 /dev/random 来生成内容。有没有办法可以使用文件 /dev/random 列出所有程序?
我们还可以看到,一旦熵池被清空,只需不到一分钟就可以产生“可接受的水平”的熵。
答案1
熵的输入/dev/random
速度相当慢,因此如果您使用任何使用 的程序/dev/random
,熵较低是很常见的。
即使您相信 Linux 对熵的定义,低熵也不是安全问题。/dev/random
阻塞直到它满意它有足够的熵。在低熵的情况下,您将得到应用程序等待您摆动鼠标,但不会失去随机性。
事实上,Linux 对熵的定义是有缺陷的:它是一个极其保守的定义,力求达到理论上的随机性水平,但在实践中毫无用处。事实上,熵不会耗尽——一旦你有足够的,你就已经足够了。不幸的是,Linux 只有两个接口来获取随机数:/dev/random
,它在不应该阻塞的时候阻塞,以及/dev/urandom
,它从不阻塞。幸运的是,在实践中,/dev/urandom
几乎总是正确的,因为系统快速收集足够的熵,之后/dev/urandom
永远可以(包括生成加密密钥等用途)。
唯一/dev/urandom
出现问题的时候是系统还没有足够的熵,例如首次启动全新安装时、启动 Live CD 后或克隆虚拟机后。在这种情况下,请等到/proc/sys/kernel/random/entropy_avail
达到 200 左右。之后,您可以/dev/urandom
随意使用。
答案2
没有剩余熵并且知道具有/dev/random
确定性。这使得其他进程(包括由恶意用户启动的进程)能够“预测”未来的输出(即从中读取的字节)/dev/random
。
一方面,一个需要“真正”随机性的优秀 Linux 程序员会仔细阅读随机(4)所以会阅读(2)/dev/random
如果没有可用的熵,则会阻塞。这可能会惹恼从中读取数据的进程。另请参阅(正如OP评论的那样)关于的神话urandom
页。
另一方面,一些程序员更喜欢从中读取/dev/urandom
几乎总是足够好的并且不会阻塞。 AFAIK,C++11 标准库海湾合作委员会这样做是为了std::random_device。
显然,随机性在服务器上比在普通桌面上更重要。
如果你的问题变成了“Linux 程序员是否使用得/dev/random
足够好来意识到这些问题”,那么它就变成了一个意见问题,或者一个民意调查,那么这里可能就偏离主题了。
我的观点是程序员应该阅读随机(4)。
最近的英特尔处理器有罗德兰德机器指令,并/dev/random
使用它(和其他一些东西)作为随机源。所以我想缺乏熵/dev/random
不会影响(即永远不会发生)它们。
简而言之,我不关心 中的低熵/dev/random
。但我编写的软件并不是随机性至关重要的软件(例如扑克网站、某些银行系统)(以至于要付出生命或数百万欧元或美元的代价)。我想这样的系统可以负担得起更好的随机源(IIRC,具有兆位/秒带宽的硬件随机生成器,成本为几百欧元),并且它们应该拥有(或购买咨询服务)随机性和概率方面的专业知识。
README
也许,您应该简单地在和 文档中提及你的软件,您正在使用/dev/random
和/或/dev/urandom
,出于什么目的,并明确记录随机性对于您自己的代码的重要性。