【发布时间】:2014-05-17 14:41:36
【问题描述】:
我正在尝试找出 /dev/random 和 /dev/urandom 文件之间的区别
-
/dev/random和/dev/urandom有什么区别? - 什么时候应该使用它们?
- 什么时候不应该使用它们?
【问题讨论】:
我正在尝试找出 /dev/random 和 /dev/urandom 文件之间的区别
/dev/random 和/dev/urandom 有什么区别? 【问题讨论】:
使用/dev/random 可能需要等待结果,因为它使用所谓的熵池,此时随机数据可能不可用。
/dev/urandom 返回的字节数与用户请求的一样多,因此它的随机性低于/dev/random。
可以从手册页中阅读:
随机
读取时,
/dev/random设备将仅返回其中的随机字节 熵池中估计的噪声位数。/dev/random应该适用于需要非常高质量随机性的用途 例如一次性填充或密钥生成。当熵池为 为空,从/dev/random读取将阻塞,直到额外 收集环境噪音。
随机
从
/dev/urandom设备读取不会阻塞等待更多 熵。因此,如果没有足够的熵 熵池,返回的值理论上容易受到 对驱动程序使用的算法的加密攻击。知识 如何做到这一点在当前未分类中不可用 文献,但从理论上讲,这种攻击可能 存在。如果这是您的应用程序中的一个问题,请使用/dev/random而是。
出于加密目的,您应该真正使用/dev/random,因为它返回的数据性质。为了安全起见,IMO 应将可能的等待视为可接受的权衡。
当您需要快速随机数据时,当然应该使用/dev/urandom。
【讨论】:
始终使用 /dev/urandom。
/dev/urandom 和 /dev/random 使用相同的随机数生成器。它们都由同一个熵池播种。它们都将给出任意大小的同样随机数。它们都可以只用 256 位种子给出无限数量的随机数。只要初始种子有 256 位熵,您就可以无限供应任意长的随机数。使用 /dev/random 没有任何好处。有两个设备的事实是 Linux API 中的一个缺陷。
如果您担心熵,使用 /dev/random 并不能解决这个问题。但它会减慢您的应用程序,同时不会生成比 /dev/urandom 更随机的数字。如果你不关心熵,你为什么要使用 /dev/random?
以下是关于为什么应该始终使用 /dev/urandom 的更好/更深入的解释:http://www.2uo.de/myths-about-urandom/
内核开发人员正在讨论删除 /dev/random:https://lwn.net/SubscriberLink/808575/9fd4fea3d86086f0/
【讨论】:
/dev/random和/dev/urandom有什么区别?
/dev/random 和 /dev/urandom 是内核随机数生成器的接口:
说到差异,这取决于操作系统:
/dev/random 读取可能会阻塞,这大大限制了它在实践中的使用/dev/urandom 只是指向/dev/random 的符号链接。我应该什么时候使用它们? 我什么时候不应该使用它们?
很难找到应该使用/dev/random 而不是/dev/urandom 的用例。
阻塞的危险:
/dev/random 时,这是您必须面对的真正问题。对于像ssh-keygen 这样的单一用法,等待几秒钟应该没问题,但对于大多数其他情况,这不是一个选择。/dev/random,您应该以非阻塞模式打开它,并在所需的熵不能立即获得时提供某种用户通知。安全性:
/dev/urandom 对于几乎所有实际情况(例如,Is a rand from /dev/urandom secure for a login key? 和 Myths about /dev/urandom)都被认为是安全的。
/dev/random接口被认为是一个遗留接口,/dev/urandom是首选且足够的 所有用例,但在早期启动时需要随机性的应用程序除外;为了 在这些应用程序中,必须使用 getrandom(2),因为它会阻塞直到熵池被初始化。如果按照以下建议在重启后保存种子文件(所有主要的 Linux 发行版都这样做了 至少从 2000 年开始),输出对没有本地 root 访问权限的攻击者是加密安全的 一旦它在引导序列中重新加载,并且完全适合网络加密会话密钥。 由于从
/dev/random读取可能会阻塞,用户通常希望以非阻塞模式打开它(或执行 超时读取),并在所需的熵不能立即获得时提供某种用户通知。
推荐
作为一般规则,/dev/urandom 应用于除长期 GPG/SSL/SSH 密钥之外的所有内容。
【讨论】:
/dev/urandom
它们都由相同的加密安全伪随机数生成器 (CSPRNG) 提供。 /dev/random 等待熵(或者更具体地说,等待系统对其熵的估计达到适当水平)这一事实仅在您使用信息理论安全算法而不是计算安全算法时才会产生影响.前者包含您可能没有使用的算法,例如 Shamir 的秘密共享和一次性便笺簿。后者包含您实际使用和关心的算法,例如 AES、RSA、Diffie-Hellman、OpenSSL、GnuTLS 等。
因此,如果您使用来自 /dev/random 的数字并不重要,因为无论如何它们都会从 CSPRNG 中抽出,并且“理论上有可能”破坏您可能使用它们的算法。
最后,“理论上可能”的意思就是这个意思。在这种情况下,这意味着在宇宙存在的时间内使用世界上所有的计算能力来破解应用程序。
因此,使用/dev/random 几乎没有意义
所以使用/dev/urandom
【讨论】: