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/urandomrandomエントロピープールを使用すると、複数のソースからノイズを収集し、現在のプールに「どのくらいの」ノイズがあるかを追跡するため、random生成できる高品質のランダム性がどれくらいになるかを確認できます。エントロピープールには限られた量のノイズがあるため、random使用可能なエントロピーが不十分な場合は読み取りをブロックする必要があります。urandomブロックされませんが、「ランダムでない」データを取得できます。

random(4)マニュアルページから:

読み取ると、/ dev / randomデバイスはエントロピープールの予想ノイズビット数内のランダムバイトのみを返します。 /dev/randomは、使い捨てパッドやキー生成など、非常に高品質のランダム性が必要な用途に適している必要があります。エントロピープールが空の場合、追加の周囲ノイズが収集されるまで、/ dev / random読み取りはブロックされます。

/dev/urandomデバイスからの読み込みは、追加のエントロピーを待つことをブロックしません。したがって、エントロピープールに十分なエントロピーがない場合、返された値は理論的にドライバが使用するアルゴリズムによる暗号化攻撃に対して脆弱です。

おすすめ記事