/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の正確な意味は何ですか?また、使用可能なランダムビットの実数を検出するにはどうすればよいですか?
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
を使用します。