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

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

我明白了疯狂地real times当我运行以下命令时有所不同。

dd if=/dev/random bs=1k count=1 

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

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

Minimum   Maximum  Average   Median
00.002    89.999   4.50402   2.275 

有人对为什么会发生这种情况有任何建议吗?
系统是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

答案1

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

random(4)手册页:

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

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

答案2

http://en.wikipedia.org/wiki//dev/random#Linux:

“当熵池为空时,从 /dev/random 读取数据将被阻塞,直到收集到额外的环境噪音。”

编辑:看起来迈克尔比我先一步!

相关内容