【问题标题】:differences between random and urandom随机和随机的区别
【发布时间】:2014-05-17 14:41:36
【问题描述】:

我正在尝试找出 /dev/random/dev/urandom 文件之间的区别

  1. /dev/random/dev/urandom 有什么区别?
  2. 什么时候应该使用它们?
  3. 什么时候不应该使用它们?

【问题讨论】:

    标签: random prng


    【解决方案1】:

    使用/dev/random 可能需要等待结果,因为它使用所谓的熵池,此时随机数据可能不可用。

    /dev/urandom 返回的字节数与用户请求的一样多,因此它的随机性低于/dev/random

    可以从手册页中阅读:

    随机

    读取时,/dev/random 设备将仅返回其中的随机字节 熵池中估计的噪声位数。 /dev/random 应该适用于需要非常高质量随机性的用途 例如一次性填充或密钥生成。当熵池为 为空,从/dev/random 读取将阻塞,直到额外 收集环境噪音。

    随机

    /dev/urandom 设备读取不会阻塞等待更多 熵。因此,如果没有足够的熵 熵池,返回的值理论上容易受到 对驱动程序使用的算法的加密攻击。知识 如何做到这一点在当前未分类中不可用 文献,但从理论上讲,这种攻击可能 存在。如果这是您的应用程序中的一个问题,请使用/dev/random 而是。

    出于加密目的,您应该真正使用/dev/random,因为它返回的数据性质。为了安全起见,IMO 应将可能的等待视为可接​​受的权衡。

    当您需要快速随机数据时,当然应该使用/dev/urandom

    来源:Wikipedia页面,man页面

    【讨论】:

    • 我不同意。今天,/dev/urandom 几乎在所有情况下都可以安全(并且首选)用于密码学。查看其他答案。
    • jrwren,有很多关于“关于 urandom 的神话”是完全错误且高度误导的,如果你仔细想想,这没有任何意义!开始的图表在结构上是错误的,他们表明 random 和 urandom 来自同一个 CSPNG 源,实际上它们不是根据这篇文章:lwn.net/Articles/525459
    【解决方案2】:

    始终使用 /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/

    【讨论】:

      【解决方案3】:

      /dev/random/dev/urandom 有什么区别?

      /dev/random/dev/urandom 是内核随机数生成器的接口:

      • 读取会返回足够强的随机字节流以用于加密
      • 写入它们将提供内核数据以更新熵池

      说到差异,这取决于操作系统:

      • 在 Linux 上,从 /dev/random 读取可能会阻塞,这大大限制了它在实践中的使用
      • 在 FreeBSD 上,没有。 /dev/urandom 只是指向/dev/random 的符号链接。

      我应该什么时候使用它们? 我什么时候不应该使用它们?

      很难找到应该使用/dev/random 而不是/dev/urandom 的用例。

      阻塞的危险:

      • 当您决定使用/dev/random 时,这是您必须面对的真正问题。对于像ssh-keygen 这样的单一用法,等待几秒钟应该没问题,但对于大多数其他情况,这不是一个选择。
      • 如果您使用/dev/random,您应该以非阻塞模式打开它,并在所需的熵不能立即获得时提供某种用户通知。

      安全性:

      /dev/random 接口被认为是一个遗留接口,/dev/urandom 是首选且足够的 所有用例,但在早期启动时需要随机性的应用程序除外;为了 在这些应用程序中,必须使用 getrandom(2),因为它会阻塞直到熵池被初始化。

      如果按照以下建议在重启后保存种子文件(所有主要的 Linux 发行版都这样做了 至少从 2000 年开始),输出对没有本地 root 访问权限的攻击者是加密安全的 一旦它在引导序列中重新加载,并且完全适合网络加密会话密钥。 由于从/dev/random 读取可能会阻塞,用户通常希望以非阻塞模式打开它(或执行 超时读取),并在所需的熵不能立即获得时提供某种用户通知。

      推荐

      作为一般规则,/dev/urandom 应用于除长期 GPG/SSL/SSH 密钥之外的所有内容。

      【讨论】:

        【解决方案4】:

        简答

        使用/dev/urandom

        长答案

        它们都由相同的加密安全伪随机数生成器 (CSPRNG) 提供。 /dev/random 等待熵(或者更具体地说,等待系统对其熵的估计达到适当水平)这一事实仅在您使用信息理论安全算法而不是计算安全算法时才会产生影响.前者包含您可能没有使用的算法,例如 Shamir 的秘密共享和一次性便笺簿。后者包含您实际使用和关心的算法,例如 AES、RSA、Diffie-Hellman、OpenSSL、GnuTLS 等。

        因此,如果您使用来自 /dev/random 的数字并不重要,因为无论如何它们都会从 CSPRNG 中抽出,并且“理论上有可能”破坏您可能使用它们的算法。

        最后,“理论上可能”的意思就是这个意思。在这种情况下,这意味着在宇宙存在的时间内使用世界上所有的计算能力来破解应用程序。

        因此,使用/dev/random 几乎没有意义

        所以使用/dev/urandom

        来源

        1 2 3

        【讨论】:

        • 我同意这种情况,但是有硬件rng的情况呢?例如,如果您只想使用该 rng,在这种情况下会发生什么?
        • @Owl 来自硬件 rng 的熵被输入内核的熵池。 /dev/random 和 /dev/urandom 使用相同的池。请记住,两个设备都使用完全相同的 prng,因此一个的熵源是另一个的熵源。如果您只想从硬件 rng 中提取熵,则必须直接从设备中读取。内核 api 总是使用内核的 prng。
        猜你喜欢
        • 1970-01-01
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 2015-11-19
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多