/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回は慎重に読み取るように設計する必要があります 起動時に、
インターネットと通信するサービスを実行する前、または暗号化を必要とするサービスを実行する前に、
キーが予測どおりに生成されるのを回避します。