dd if=/dev/random 是“随机”的瓶颈,时间滞后很大,但我不知道为什么

Pet*_*r.O 6 performance random

我得到的疯狂不同real times,当我运行下面的命令。

dd if=/dev/random bs=1k count=1 
Run Code Online (Sandbox Code Playgroud)

它不会发生if=/dev/null,也不会发生if=/dev/urandom

我已经运行了 500 次。以下是一般统计数据(每次通话)。时间以秒为单位。

Minimum   Maximum  Average   Median
00.002    89.999   4.50402   2.275 
Run Code Online (Sandbox Code Playgroud)

有没有人对为什么会发生这种情况有任何建议?
系统为Ubuntu 10.04桌面。Bash 版本是 4.1.5(1)
它还显示了运行相同版本 Ubuntu 的 VirtualBox VM 中类似的剧烈波动。


这是实际的测试代码

cp /dev/null "$HOME/dd-random.secs" 
for ((i=100;i<=500;i++)); do
    if   ((i<10))  ;then zi="00$i"
    elif ((i<100)) ;then zi="0$i"
    else                 zi="$i"
    fi 
    echo -ne "$zi\t" >>"$HOME/dd-random.secs"
    exec 3>/dev/null 4>/dev/null
        { time { dd if=/dev/random bs=1k count=1; } 1>&3 2>&4; } 2>&1 |tail -n 3|tr 'm\n' '\t' |sed -re "s/([0-9])s/\1/g" >>"$HOME/dd-random.secs" 
    exec 3>&- 4>&-
    echo >>"$HOME/dd-random.secs"
done
Run Code Online (Sandbox Code Playgroud)

Mic*_*zek 19

这正是/dev/random/dev/urandom-之间的区别-random使用熵池,它从一堆来源收集噪声并跟踪池中当前“有多少”噪声,因此random知道它可以产生多少高质量的随机性。由于熵池的噪声量是有限的,random如果没有足够的可用熵,则可能需要阻塞读取。urandom从不阻塞,但您可能会从中获得“较少随机”的数据。

random(4)手册页:

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

从 /dev/urandom 设备读取不会阻塞等待更多熵。因此,如果熵池中没有足够的熵,则返回值理论上容易受到对驱动程序使用的算法的加密攻击。