/dev/random
から読み取ると、Linuxボックスで利用できるエントロピーに非常に大きな影響があることに気付きました。
(/proc/system/kernel/random/entropy_avail
から読み取る)、
しかし、/dev/urandom
から読み取ると(実際のエントロピーによってシードされたと理解していますが、実際にはCSPRNG)、高品質のエントロピーデータを生成できますが、entropy_avail
はドロップしません...
これはどのようにして可能ですか、または何か不足していますか?
/dev/urandom
は、CSPRNG(前回チェックしたChacha20)を使用して、初期シードからランダムデータのストリームを生成し、ユーザーがそこから任意の数のビットを読み取ることができるようにします。 /dev/random
は、補充する必要のあるランダムプールからデータを引き出します。
システムがデータの安全なストリームを提供するのに十分なエントロピーを得る前に/dev/urandom
から読み取ることができます。その場合、カーネルログは初期化されていない読み取りに関する警告を示すはずです。これが懸念される場合、たとえば組み込みシステムでは、プログラムに使用を開始させる前に、ハードウェア乱数ジェネレータを使用して追加のエントロピーを生成する必要があります。
システムが十分なエントロピーを収集した場合、urandom
から暗号的に安全なランダムデータを取得し、random
から理論的に安全なデータを取得します。情報理論上安全ではない暗号化スキームを使用している場合、または大量の暗号化キーを生成していない場合は、urandom
を使用することもできます。
カーネルがプログラムで使用できるNice getrandom
システムコールを公開しているので、/dev/random
または/dev/urandom
から直接読み取ることはできません。これは、試行時にいくつかの落とし穴を避けるのに役立ちますキャラクターデバイスから直接読み取る。
この回答 には、2つのRNGデバイスの違いに関する詳細があります。