私は/dev/urandom
について読んでおり、私が知る限り、/dev/random
はネットワークパケットタイミングなどのいくつかのイベントを利用して暗号乱数を作成します。しかし、/dev/urandom
は、/dev/random
?からの番号でシードされたPRNGを使用しますまたは、ビットがある限り/dev/random
を使用します-そして、それらがなくなると、どこからシードが収集されたPRNG?
urandom
マンページから:
乱数ジェネレーターは、デバイスドライバーや他のソースからの環境ノイズをエントロピープールに収集します。ジェネレーターは、エントロピープール内のノイズのビット数の推定値も保持します。このエントロピープールから乱数が作成されます。
読み取られると、/ dev/randomデバイスは、エントロピープール内のノイズの推定ビット数内のランダムバイトのみを返します。/dev/randomは、ワンタイムパッドやキー生成など、非常に高品質のランダム性を必要とする用途に適している必要があります。 エントロピープールが空の場合、/ dev/randomからの読み取りはブロックされます追加の環境ノイズが収集されるまで。
/ dev/urandomデバイスからの読み取りは、さらにエントロピーを待つことをブロックしません。その結果、エントロピープールに十分なエントロピーがない場合、戻り値は、理論的には、ドライバーが使用するアルゴリズムに対する暗号攻撃に対して脆弱です。これを行う方法の知識は、現在の未分類の文献では入手できませんが、そのような攻撃が存在する可能性は理論的には可能です。これがアプリケーションで問題になる場合は、代わりに/ dev/randomを使用してください。
どちらもPRNGを使用しますが、環境データとエントロピープールを使用すると、天文学的にPRNGを解読することがはるかに難しくなり、まったく同じ環境データを収集しないと不可能になります。
経験則として、たとえば量子イベントからデータを収集する特殊な高価なハードウェアがなければ、真の乱数ジェネレーター(つまり、真に予測不可能な数値を生成するRNG)はありません。ただし、暗号化の目的には/ dev/randomまたは/ dev/urandomで十分です(使用する方法はCPRNG、暗号化擬似乱数ジェネレータ用です)。
エントロピープールと/ dev/randomの読み取りのブロックは、乱数を予測できないようにするための安全策として使用されます。たとえば、攻撃者がシステムのエントロピープールを使い果たした場合、今日の技術では非常にまれですが、長時間再シードされていない/ dev/urandomの出力を予測できる可能性があります(ただし、また、攻撃者はより多くのエントロピーを収集するシステムの能力を使い果たす必要がありますが、これも天文学的にはありえないことです)。
実際に必要なのは、FreeBSDの/dev/urandom
が提供するものです:/dev/random
から十分な長さの初期シードを読み取り、PRNGを使用します。したがって、最初(システムブート直後)にブロックされる場合がありますが、十分なエントロピーを収集すると、ブロックされることはありません。これにより、ほとんどの暗号化プロトコルに必要なレベルのランダム性が提供されますが、過度にブロックされることはありません。
Linuxの/dev/urandom
は似ており、ブロックしないため、ブート直後に使用すると低品質のランダム性を返すリスクがあります。一方、/dev/random
は起動後も長時間ブロックされる可能性があり、これも問題です。いくつかのソフトウェアが/dev/random
の使用を要求していて、キーボードのないサーバーが十分なエントロピーを取得していなかったため、サーバーが不思議に失速するのをよく見ました。
通常のLinuxディストリビューションは、シャットダウン時に/dev/urandom
から取得したランダムシードを保存し、次のブート時にそれをインジェクトして、/dev/urandom
によって提供されるランダムの品質を保証します。 OSのインストール中にのみ暗号化の品質が問題になります。通常は、インストールにはインストールを実行する人間との多数の対話が含まれ、エントロピーの大群が生じるためではありません。
要約すると、LinuxとFreeBSDの両方で、/dev/urandom
ではなく/dev/random
を使用する必要があります。
引用 ここ
/dev/random
は、エントロピープールが使い果たされた後にブロックします。利用可能なエントロピーのソースから追加のデータが収集されるまで、ブロックされたままになります。これにより、ランダムなデータ生成が遅くなる可能性があります。
/dev/urandom
はブロックしません。代わりに、内部プールを再利用して、より多くの擬似ランダムビットを生成します。
/dev/urandom
は次の場合に最適です。
dd
コマンドを使用して、ディスクをランダムデータで置き換えることにより、ディスクからデータを消去します。/dev/random
代わりに。/dev/random
は、次の場合に適している可能性があります。