/dev/random
を使用する必要があります または/dev/urandom
?
どのような状況でどちらを優先しますか?
承認された回答:
TL; DR
/dev/urandom
を使用します 最も実用的な目的のために。
長い答えは、実行しているUnixのフレーバーによって異なります。
Linux
歴史的に、/dev/random
および/dev/urandom
同時に紹介されました。
@DavidSchwartzがコメントで指摘したように、/dev/urandom
を使用します ほとんどの場合、が優先されます。彼と他の人々はまた、/dev/urandom
に関する優れた神話へのリンクを提供しました さらに読むことをお勧めする記事。
要約:
- マンページは誤解を招く可能性があります。
- どちらも同じによって供給されます ランダム性を生成するCSPRNG(図2および3)
-
/dev/random
エントロピーがなくなるとブロックされるため、
/dev/random
から読み取ります プロセスの実行を停止できます。 - エントロピーの量は控えめに見積もられていますが、カウントされていません
-
/dev/urandom
ブロックされることはありません。 - まれに、起動直後に、CSPRNGに適切にシードされた
/dev/urandom
を実行するのに十分なエントロピーがない場合があります。 高品質のランダム性が生成されない場合があります。 - CSPRNGが最初に適切にシードされていれば、エントロピーが少なくなることは問題ではありません。
- CSPRNGは常に再シードされています。
- Linux 4.8以降では、
/dev/urandom
エントロピープールを使い果たしません(/dev/random
で使用されます) )ただし、アップストリームからのCSPRNG出力を使用します。 -
/dev/urandom
を使用します 。
ルールの例外
CryptographyStackExchangeの/dev/random
を使用する場合 /dev/urandom
以上 Linuxでは@otusは2つのユースケースを提供します:
-
低エントロピーデバイスで起動した直後、
/dev/urandom
を適切にシードするのに十分なエントロピーがまだ生成されていない場合 。 -
情報理論的安全性を備えたワンタイムパッドの生成
(1)が気になる場合は、/dev/random
で利用可能なエントロピーを確認できます。 。
あなたが(2)をしているなら、あなたはそれをすでに知っているでしょう🙂
注:/ dev / randomからの読み取りがブロックされるかどうかを確認できますが、競合状態の可能性に注意してください。
代替:どちらも使用しないでください!
@otusは、getrandom()
も指摘しました システムは/dev/urandom
から読み取ります 初期シードエントロピーが利用できない場合にのみブロックします。
/dev/urandom
の変更に問題があります getrandom()
を使用するには 、ただし、新しい/dev/xrandom
デバイスはgetrandom()
に基づいて作成されます 。
macOS
ウィキペディアが言うように、それは問題ではありません:
macOSは、SHA1に基づく160ビットのYarrowを使用します。 / dev/randomと/dev/urandomの間に違いはありません。どちらも同じように動作します。 AppleのiOSもYarrowを使用しています。
FreeBSD
ウィキペディアが言うように、それは問題ではありません:
/dev/urandom
/dev/random
への単なるリンクです 適切にシードされるまでブロックするだけです。
これは、起動後、FreeBSDが十分に賢く、十分なシードエントロピーが収集されるまで待ってから、終わりのないランダムな良さのストリームを提供することを意味します。
関連:Linux – Oraclejava7をsetcapcap_net_bind_service+ epで動作させる方法は?NetBSD
/dev/urandom
を使用します 、システムが/dev/random
から少なくとも1回読み取ったと仮定します 適切な初期シードを確保するため。
rnd(4)のマンページには次のように書かれています:
/dev/urandom
ブロックすることはありません。
/dev/random
時々ブロックします。
システムの状態が予測可能であることがわかっている場合は、起動時に早期にブロックします。アプリケーションは
/dev/urandom
から読み取る必要があります ランダムに生成されたデータが必要な場合
例:シミュレーション用の暗号化キーまたはシード。システムは、
/dev/random
から少なくとも1回は慎重に読み取るように設計する必要があります 起動時に、
インターネットと通信するサービスを実行する前、または暗号化を必要とするサービスを実行する前に、
キーが予測どおりに生成されるのを回避します。