web-dev-qa-db-ja.com

/ dev / randomからの読み取りがブロックするかどうかを確認する方法

/proc/sys/kernel//random/entropy_avail/dev/randomで使用可能なビット数を示すという情報を見つけました。 /dev/randomからの次の読み取りがブロックされるかどうかを確認したいと思いました。私の素朴なアプローチは、entropy_availと必要なランダムビットの数を比較することだけでしたが、うまく機能しません。単純な愚かな実験をしたとき、エントロピーが緩衝されていることに気づきました。 64ビットのエントロピーバッファーは、6バイトのランダムデータを提供します。

次の簡単なコマンドでentropy_availを監視しました。

while true
do
    cat /proc/sys/kernel//random/entropy_avail
    sleep 1
done

そして、私はコマンドを介してランダムなバイトを取得しようとしていました

dd if=/dev/random bs=1 count=1 > /dev/null

エントロピーが63以下の場合、ddコマンドはブロックされます。エントロピーが64に達してバイトを読み取ると、エントロピーは0に減少しますが、ブロックせずにさらに5バイトを読み取ることができます。次に、エントロピーが64に達するまでddが再びブロックされます。

Entropy_availの正確な意味は何ですか?また、使用可能なランダムビットの実数を検出するにはどうすればよいですか?

8
Zaboj Campula

entropy_availは、/dev/randomで使用可能なビット数を示していません。これは、/dev/randomを累乗するRNG状態でのカーネルのエントロピー推定を示します。そのエントロピー推定は、数学的に言えば、かなり意味のない量です。ただし、エントロピーの見積もりが低すぎる場合、Linuxは/dev/randomをブロックします。

/dev/randomから読み取るプログラムは、/proc/sys/kernel/random/entropy_availの値が/proc/sys/kernel/random/read_wakeup_thresholdより大きくなるまでブロックします。 /dev/randomからの読み取りは、バイトあたり8ビットの割合でエントロピーを消費します。

とにかく、あなたは/dev/randomを使うべきではありません。 /dev/urandomを使用する必要があります。これは、暗号化キー の生成も含めて安全で、ブロックされません。乱数の生成はエントロピーを消費しません。システムに十分なエントロピーがあれば、それは宇宙の寿命にとって良いことです。 OSはRNGシードをファイルに保存するので、一度システムが十分なエントロピーを持つと、再起動後でも十分なエントロピーが得られます。

/dev/urandomが安全でない唯一のケースは、新しくインストールされたシステムが初めて起動したとき、起動したばかりのライブシステム上です(したがって、ライブシステムから暗号化キーを生成することはお勧めしません!)、または、ハードウェアRNGも永続メモリも持たない、新しく起動した組み込みデバイス。そのようなシステムでは、/dev/randomが16バイトを解放することに同意するまで待って、エントロピープールが構築されていることを確認します。次に、/dev/urandomを使用します。