web-dev-qa-db-ja.com

randomとurandomの違い

/dev/random/dev/urandomファイルの違いを見つけようとしています。

  1. /dev/random/dev/urandomの違いは何ですか?
  2. いつ使用するべきですか?
  3. いつ使用しないのですか?
46
fernandohur

/dev/randomを使用すると、いわゆるエントロピープールを使用するため、結果を待つ必要があります。この場合、ランダムデータは現時点では利用できません。

/dev/urandomはユーザーが要求したバイト数を返すため、/dev/randomよりもランダムではありません。

Manページから読むことができます:

ランダム

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

urandom

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

暗号化の目的では、返されるデータの性質のため、/dev/randomを実際に使用する必要があります。待機の可能性は、セキュリティのために許容できるトレードオフと見なされる必要があります、IMO。

ランダムデータfastが必要な場合は、もちろん/dev/urandomを使用する必要があります。

ソース: Wikipedia page、 man page

40
Alexey Malev

常に/ dev/urandomを使用します。

/ dev/urandomと/ dev/randomは同じ乱数ジェネレーターを使用します。どちらも同じエントロピープールによってシードされます。両方とも、任意のサイズの等しくランダムな数を提供します。どちらも256ビットのシードのみで無限の乱数を生成できます。初期シードに256ビットのエントロピーがある限り、任意の長さの乱数を無限に供給することができます。/dev/randomを使用しても何も得られません。 2つのデバイスがあるという事実は、Linux APIの欠陥です。

エントロピーが心配な場合は、/ dev/randomを使用しても修正されません。ただし、/ dev/urandomよりもランダムに数値を生成しない一方で、アプリケーションの速度が低下します。また、エントロピーに関心がない場合、なぜ/ dev/randomを使用しているのですか?

常に/ dev/urandomを使用する必要がある理由については、次のとおりです。 http://www.2uo.de/myths-about-urandom/

23
Ironlenny

/dev/random/dev/urandomの違いは何ですか?

/dev/randomおよび/dev/urandomは、カーネルの乱数ジェネレーターへのインターフェースです。

  • 読み取りは、暗号化で使用するのに十分な強度のランダムバイトのストリームを返します
  • それらに書き込むと、エントロピープールを更新するカーネルデータが提供されます。

違いについては、オペレーティングシステムによって異なります。

  • Linuxでは、/dev/randomからの読み取りがブロックされる場合があり、実際の使用はかなり制限されます
  • FreeBSDでは、何もありません。 /dev/urandomは、/dev/randomへの単なるシンボリックリンクです。

いつ使うべきですか?いつ使用しないのですか?

/dev/randomではなく/dev/urandomを使用する必要があるユースケースを見つけることは非常に困難です。

ブロッキングの危険性:

  • これは、/dev/randomを使用する場合に直面しなければならない本当の問題です。 ssh-keygenのような単一の使用法では、数秒間待機しても問題ありませんが、他のほとんどの状況ではオプションではありません。
  • /dev/randomを使用する場合、非ブロックモードで開き、目的のエントロピーがすぐに利用できない場合は、何らかのユーザー通知を提供する必要があります。

セキュリティ:

/dev/randomインターフェイスはレガシーインターフェイスと見なされ、/dev/urandomはすべてのユースケースで優先され、十分です。ただし、初期ブート時にランダム性を必要とするアプリケーションは例外です。これらのアプリケーションでは、代わりにgetrandom(2)を使用する必要があります。これは、エントロピープールが初期化されるまでブロックされるためです。

以下に推奨するようにシードファイルが再起動後に保存される場合(少なくともすべての主要なLinuxディストリビューションは2000年以降これを行っています)、出力はブートシーケンスでリロードされるとすぐにローカルルートアクセスなしの攻撃者に対して暗号的に安全であり、完全に適切ですネットワーク暗号化セッションキー用。 /dev/randomからの読み取りはブロックされる可能性があるため、ユーザーは通常、非ブロックモードで開き(またはタイムアウト付きで読み取りを実行)、目的のエントロピーがすぐに利用できない場合に何らかのユーザー通知を提供します。

推奨事項

一般的なルールとして、/dev/urandomは、長期間有効なGPG/SSL/SSHキーを除くすべてに使用する必要があります。

6
Philipp Claßen

短い答え

/dev/urandomを使用

ロングアンサー

どちらも同じ暗号で保護された擬似乱数ジェネレーター(CSPRNG)から供給されます。 /dev/randomがエントロピーを待つ(または、より具体的には、システムのエントロピーの推定が適切なレベルに達するのを待つ)という事実は、計算とは対照的に、情報理論的に安全なアルゴリズムを使用している場合にのみ違いを生じます安全なアルゴリズム。前者には、ShamirのSecret SharingやOne-timeパッドなど、おそらく使用しないアルゴリズムが含まれます。後者には、AES、RSA、Diffie-Hellman、OpenSSL、GnuTLSなど、実際に使用して注意するアルゴリズムが含まれています。

したがって、/dev/randomの数字を使用しても問題ありません。CSPRNGから出力されるため、とにかく使用している可能性のあるアルゴリズムを「理論的には」破ることができます。

最後に、その「理論的に可能な」ビットはまさにそれを意味します。この場合、それは、アプリケーションをクラックするために宇宙が存在していた期間、世界のすべての計算能力を使用することを意味します。

したがって、/dev/randomを使用してもほとんど意味がありません

だから/dev/urandomを使う

ソース

12

3
Mitchell Tracy