为什么从/ dev / random读取几乎总是阻塞?

时间:2011-12-06 03:30:01

标签: c++ linux

我正在使用内核2.6.38-12-generic

的kubuntu

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

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

我正在使用它作为uuid生成器,其他随机源添加到种子 我的mersenne twister。至关重要的是,我不会得到重复或重复的种子。

如果我改为/ dev / urandom,它可以正常工作。关于在/ dev / urandom上使用/ dev / random的任何观点。

3 个答案:

答案 0 :(得分:14)

你真的不应该使用/dev/random。没有已知的情况/dev/random优于/dev/urandom的优点,以及缺点非常明显。

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

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

答案 1 :(得分:5)

man 4 random的{​​{3}}回答了问题:

  

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

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

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

另请阅读ThomasHühn的PRNG

答案 2 :(得分:4)

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

然而,

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