web-dev-qa-db-ja.com

/ dev / urandomを理解しましたか?

私は/dev/urandomについて読んでおり、私が知る限り、/dev/randomはネットワークパケットタイミングなどのいくつかのイベントを利用して暗号乱数を作成します。しかし、/dev/urandomは、/dev/random?からの番号でシードされたPRNGを使用しますまたは、ビットがある限り/dev/randomを使用します-そして、それらがなくなると、どこからシードが収集されたPRNG?

67
Tower

urandomマンページから:

乱数ジェネレーターは、デバイスドライバーや他のソースからの環境ノイズをエントロピープールに収集します。ジェネレーターは、エントロピープール内のノイズのビット数の推定値も保持します。このエントロピープールから乱数が作成されます。

読み取られると、/ dev/randomデバイスは、エントロピープール内のノイズの推定ビット数内のランダムバイトのみを返します。/dev/randomは、ワンタイムパッドやキー生成など、非常に高品質のランダム性を必要とする用途に適している必要があります。 エントロピープールが空の場合、/ dev/randomからの読み取りはブロックされます追加の環境ノイズが収集されるまで。

/ dev/urandomデバイスからの読み取りは、さらにエントロピーを待つことをブロックしません。その結果、エントロピープールに十分なエントロピーがない場合、戻り値は、理論的には、ドライバーが使用するアルゴリズムに対する暗号攻撃に対して脆弱です。これを行う方法の知識は、現在の未分類の文献では入手できませんが、そのような攻撃が存在する可能性は理論的には可能です。これがアプリケーションで問題になる場合は、代わりに/ dev/randomを使用してください。

どちらもPRNGを使用しますが、環境データとエントロピープールを使用すると、天文学的にPRNGを解読することがはるかに難しくなり、まったく同じ環境データを収集しないと不可能になります。

経験則として、たとえば量子イベントからデータを収集する特殊な高価なハードウェアがなければ、真の乱数ジェネレーター(つまり、真に予測不可能な数値を生成するRNG)はありません。ただし、暗号化の目的には/ dev/randomまたは/ dev/urandomで十分です(使用する方法はCPRNG、暗号化擬似乱数ジェネレータ用です)。

エントロピープールと/ dev/randomの読み取りのブロックは、乱数を予測できないようにするための安全策として使用されます。たとえば、攻撃者がシステムのエントロピープールを使い果たした場合、今日の技術では非常にまれですが、長時間再シードされていない/ dev/urandomの出力を予測できる可能性があります(ただし、また、攻撃者はより多くのエントロピーを収集するシステムの能力を使い果たす必要がありますが、これも天文学的にはありえないことです)。

93
Lie Ryan

実際に必要なのは、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を使用する必要があります。

31
Thomas Pornin

引用 ここ

/dev/randomは、エントロピープールが使い果たされた後にブロックします。利用可能なエントロピーのソースから追​​加のデータが収集されるまで、ブロックされたままになります。これにより、ランダムなデータ生成が遅くなる可能性があります。

/dev/urandomはブロックしません。代わりに、内部プールを再利用して、より多くの擬似ランダムビットを生成します。


/dev/urandomは次の場合に最適です。

  • 何らかのテストのために、ランダムなデータを含む大きなファイルが必要です。
  • ddコマンドを使用して、ディスクをランダムデータで置き換えることにより、ディスクからデータを消去します。
  • 使用する理由が本当にない他のほぼすべての場所/dev/random代わりに。

/dev/randomは、次の場合に適している可能性があります。

  • ランダム性は、アプリケーションの暗号化のセキュリティにとって重要です–ワンタイムパッド、キー生成。
8
zangw