回答:
システムは、ネットワークアクティビティ、ハードウェア乱数ジェネレーター(使用可能な場合。たとえば、VIAプロセッサーには通常「実際の」乱数ジェネレーターなど)などのさまざまなイベントを監視することで、いくつかの「実際の」乱数を収集します。/ dev / randomで使用されるカーネルエントロピープールにそれらを供給する場合。いくつかの極端なセキュリティを必要とするアプリケーションは、エントロピーソース、または言い換えれば、ランダム性ソースとして/ dev / randomを使用する傾向があります。
/ dev / randomが使用可能なエントロピーを使い果たすと、それ以上のランダム性を提供できなくなり、ランダム性を利用できるようになるまでランダム性を待機するアプリケーションが停止します。私のキャリアで見た例は、Cyrus IMAPデーモンがランダム性に/ dev / randomを使用し、そのPOPセッションが/ dev / randomからAPOP接続でランダム文字列を生成したかったということです。忙しい環境では、/ dev / randomにフィードするためのトラフィックよりも多くのログインが試行されました->すべてが停止しました。その場合、rng-toolsをインストールし、それが持っていたrngdをアクティブにしました。これは、/ dev / randomが「実際の」エントロピーを使い果たした場合に、/ dev / urandomから/ dev / randomに半乱数をシャベルしました。
根本的な問題のより簡単な概要が必要な場合:一部のアプリケーション(暗号化など)には乱数が必要です。アルゴリズムを使用して乱数を生成できますが、これらはある意味ではランダムに見えますが、別の意味では完全に予測可能です。たとえば、数字58209749445923078164062862089986280348253421170679を指定すると、かなりランダムに見えます。しかし、実際にそれらがPIの数字であることに気付いた場合、次の数字が8になることがわかります。
一部のアプリケーションではこれで問題ありませんが、他のアプリケーション(特にセキュリティ関連のもの)では、予測不可能なアルゴリズム(プログラムなど)で生成できない真の予測不可能なランダム性が求められます。これは、コンピュータが本質的という問題であるプログラムなので、どのようにそれはおそらく本物の乱数を得ることができますか?答えは、外界からの真にランダムなイベントを測定することです。たとえば、キー入力間のギャップを使用し、それを使用して、予測可能な乱数ジェネレーターに真のランダム性を注入します。「エントロピープール」は、キーストローク(または使用されているもの)によって構築され、乱数の生成によって排出されるこのランダム性のストアと考えることができます。
エントロピーは「ランダム性」の専門用語です。コンピューターは実際にはエントロピーを生成しませんが、ハードドライブの回転速度の変動(摩擦などにより予測が非常に困難な物理現象)などを調べて収集します。コンピューターが擬似ランダムデータを生成する場合、マウスクリック、ハードドライブのスピン変動などを測定することで見つけた真のエントロピーを数式にシードします。大まかに言うentropy_avail
と、現在読み取り可能なビットの測定値です/dev/random
ノイズの多いダイオードなどのクールなハードウェアがない限り、コンピューターが環境からエントロピーを読み取るのに時間がかかります。
4096ビットのエントロピーを使用でき、/dev/random
さらにエントロピーを待つ間、ファイルがブロックする前に512バイトのエントロピー(4096ビット)を読み取ることができると期待できます。
たとえば、「cat /dev/random
」の場合、エントロピーはゼロに縮小します。最初は512バイトのランダムガベージを取得しますが、停止し、少しずつランダムデータトリクルトラフが表示されます。
/dev/random
しかし、これは人々が操作する方法ではありません。通常、開発者は128ビットなどの少量のデータを読み取り、それを使用して何らかのPRNGアルゴリズムをシードします。/dev/random
構築するのに時間がかかり、価値があると考えられているため、必要以上にエントロピーを読み取らないことは丁寧です。したがって、cat
上記のようにファイルを不注意にtingすることでそれを排出すると、読み取りが必要な他のアプリケーションが/dev/random
ブロックする原因になります。職場のあるシステムで、多くの暗号化機能が停止していることに気付きました。cronジョブが初期化を続けるPythonスクリプトを呼び出していることを発見しましたramdom.random()
数秒ごとに実行される各実行で。これを修正するために、Pythonスクリプトを書き直し、1回だけ初期化されたデーモンとして実行され、cronジョブがXMLRPCを介してデータを読み取り、/dev/random
起動時に読み取りを継続しないようにしました。
読み取り専用ファイルentropy_availは、利用可能なエントロピーを提供します。通常、これは4096(ビット)、完全なエントロピープールになります。
詳細については、http://linux.die.net/man/4/randomをご覧 ください。