【问题标题】:Why does reading from /dev/random nearly always block?为什么从 /dev/random 读取几乎总是阻塞?
【发布时间】:2011-12-06 03:30:01
【问题描述】:

我正在使用带有内核 2.6.38-12-generic 的 kubuntu

我想在程序开始时从 /dev/random 读取 16 个随机数。 但是,它会在相对较短的时间后阻塞。

/dev/random 缓冲区需要多长时间才能填满?为什么要花这么长时间才能填满。

我将其用作 uuid 生成器,并将其他随机源添加到种子中 我的梅森龙卷风。重要的是我不会得到重复或重复的种子。

如果我更改为 /dev/urandom,它可以正常工作。关于使用 /dev/random 而不是 /dev/urandom 的任何看法。

【问题讨论】:

标签: c++ linux


【解决方案1】:

你真的不应该使用/dev/random。没有已知的情况表明/dev/random 优于/dev/urandom 的优点很重要,缺点也很明显。

不同之处在于/dev/urandom 提供“仅”加密安全的随机数,而/dev/random 提供真正的随机数(至少,这是我们所相信的)。但是没有已知的情况表明这种差异很重要,也没有已知的测试可以区分“真正的”随机性和仅仅加密安全的随机性。

我经常开玩笑说/dev/urandom提供水,/dev/random提供圣水。

【讨论】:

  • 更正确的说法是,没有任何已知的多项式时间算法能够区分 /dev/urandom 和真正的随机流,其时间比例可忽略不计。
【解决方案2】:

man 4 randomman page 回答了这个问题:

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

我很惊讶人们更喜欢提问而不是阅读手册页!您甚至不需要 Internet 即可阅读系统的手册页。

顺便说一句,正如我评论的那样,熵池是由物理现象(取决于硬件)提供的,例如鼠标移动、按键、以太网数据包等。少数处理器具有硬件随机噪声发生器(例如RDRAND机器指令),您可以购买random USB devices(另见this列表)等... . 因此,从/dev/random 读取可能是扩展的(甚至是阻塞的)。您将使用它来获得高质量的随机性(例如加密密钥所需的),或者在初始化时为您的PRNG 播种。您应该期望/dev/random 具有相对较小的带宽(例如,每秒最多几千字节或最多一兆字节)并且它可能有很多延迟(几十毫秒,甚至更多)。细节当然是特定于计算机的。

另请阅读 Thomas Hühn 的 Myths about /dev/urandom

【讨论】:

  • 其实我已经读过了。我应该问“为什么当我最多只能读取 100 个 4 字节整数时,熵池会这么快地清空?然后需要很长时间才能从中读取更多内容。
  • “熵池”由物理现象(取决于硬件)提供,例如鼠标移动、按键、以太网数据包等。少数处理器具有硬件随机噪声发生器(但不是全部),但大多数没有。所以/dev/random很贵!
【解决方案3】:

从 /dev/random 读取是不确定的,因为它所做的只是从随机池中获取请求的位数。它将阻塞,直到它可以读取请求的位数。

然而,/dev/urandom 是内核的 PRNG,可以提供近乎无限的伪随机数流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2017-04-26
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多