/dev/random
またはを使用する必要がありますか/dev/urandom
?
どのような状況で他のものよりも1つを好むか?
答え1
長い話を短く
/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
エントロピープール(by/dev/random
)は枯渇しませんが、アップストリームCSPRNG出力が使用されます。 - 使用
/dev/urandom
。
ルールの例外
Cryptozoology スタック交換にLinuxで/dev/random
overを使用する必要がある場合/dev/urandom
@otus2つのユースケースが提供されています。:
低エントロピーデバイスから起動した直後に、適切なシードに十分なエントロピーが生成されない場合
/dev/urandom
。
(1)が気になると、利用可能なエントロピーの確認/dev/random
。
(2)をやってみるとご存知ですよ:)
注:次のことができます。/dev/randomブロックから読み取られていることを確認してください。しかし、可能な競争条件に注意してください。
代替案:両方を使用しないでください!
@otusも指摘しました。getrandom()
/dev/urandom
システムは、初期シードエントロピーが利用できない場合にのみ読み取りおよびブロックします。
持つ/dev/urandom
使用問題の変更getrandom()
/dev/xrandom
ただし、それに基づいて新しいデバイスを作成することも可能ですgetrandom()
。
アップルシステム
気にしないから ウィキペディアは言う:
macOSは160ビットを使用します。トッププールSHA1に基づいています。 /dev/randomと/dev/urandomの間に違いはありません。どちらも同じように動作します。 AppleのiOSもYarrowを使用しています。
FreeBSD
気にしないからウィキペディアは言う:
/dev/urandom
リンクがある/dev/random
場合は、正しくシードされるまでブロックされます。
これは、ブート後にFreeBSDが無限の任意の利点ストリームを提供する前に、十分なシードエントロピーが収集されるのを待つのに十分スマートであることを意味します。
ネットワークBSD
適切な初期シーディングを確実にするために、/dev/urandom
システムが少なくとも1回読んだと仮定してを使用してください。/dev/random
/dev/urandom
絶対にブロックしないでください。
/dev/random
時にはブロックされます。システム状態が予測可能であることがわかっている場合、起動時に早期にブロックされます。
/dev/urandom
アプリケーションは、シミュレーション用の暗号化キーやシードなど、ランダムに生成されたデータが必要な場合に読み取る必要があります。システムは、インターネットとの通信や
/dev/random
予測可能な鍵の生成を避けるために暗号化が必要なサービスを実行する前に、最初から少なくとも一度は賢明に読み取れるように設計する必要があります。
答え2
これは一種の「私も」答えですが、Tom Haleの推奨事項を強化します。 Linuxで完全に動作します。
- 使用
/dev/urandom
- 使用しないでください
/dev/random
Linux Kernel CryptoメーリングリストのTheodore Ts'oによると、/dev/random
このバージョンは10年間使用されなくなりました。 ~からRe: [RFC PATCH v12 3/4] Linux乱数ジェネレータ:
実際には/dev/randomを使う人はいません。これは本質的に廃止されたインターフェースです。 10年以上推奨されているデフォルトのインターフェースは/ dev / urandomで、現在はgetrandom(2)です。
定期的にテストし/dev/random
ますが、頻繁に故障します。このテストは3つのステップを実行します。 (1)/dev/random
ノンブロッキングモードで10Kバイトを要求して使い果たします。 (2)ブロックモードで16バイトを要求します。 (3)チャンクを圧縮してランダムであることを確認します(貧しい人のテスト)。テストを完了するのに数分かかります。
rng-tools
この問題は、Debainシステム(i686、x86_64、ARM、MIPS)で深刻であり、GCC Compile Farmのテストシステムにこのパッケージをインストールするように要求しました。 ~からgcc67とgcc68にrng-toolsをインストールする:
私はgcc67とgcc68にrng-toolsのインストールを要求したいと思います。これは Debian システムで、 /dev/random はデバイスを使ってライブラリをテストするときに rng-tools がないとエントロピーを消費することで困難になります。
BSDとOS Xは大丈夫に見えます。問題は確かにLinuxにあります。
Linuxはジェネレータエラーを記録しないことにも言及する価値があります。彼らはこれらのエントリがシステムログを満たすことを望まない。今日まで、ほとんどの欠陥は静かで、ほとんどのユーザーが検出できませんでした。
カーネルは少なくとも1つの失敗メッセージを印刷するので、これはすぐに変わります。 ~から[パッチ] ランダム: コンパイラ警告を無音にして競合を修正します。カーネル暗号化メーリングリスト:
特に、私は
depends on DEBUG_KERNEL
これらの有用な警告が他のカーネル開発者を迷惑させるだけであることを意味します。これがまさに私たちが望むものかもしれません。さまざまな関連開発者が特定のサブシステムで警告が表示されると、問題を解決する動機が大きくなります。一般ユーザーはDEBUG_KERNELを使用しないため、配布カーネルの一般ユーザーは警告やスパムメッセージをまったく表示できません。すべてのメッセージを抑制することは、セキュリティエンジニアリングの観点から悪い考えだと思います。
多くの人がデバッグカーネルを実行していません。これらの問題について知りたい、または知る必要があるほとんどのユーザーは、問題が発生していることに気付かないでしょう。考えてみてください。私たちはsystemd問題の原因がdmesg問題であることを学びました。
すべての構成に対してすべてのメッセージを抑制すると、必要以上に広いネットワークがキャストされます。検出および変更できる構成は目立たない場合があります。問題が公開されない場合は、問題を解決できません。
カーネルが一部の組織に対してポリシーを決定するようです。事実上、修理不可能なハードウェアがある場合、組織はリスクに応じて何をすべきかを決定する必要があります。リスクを軽減するか、ハードウェアを更新することもできます。しかし、問題に関する情報がなければ、実行可能なプロジェクトがあるという事実さえ気付かないかもしれません。
結局のところ、スレッドの後半に到達したトレードオフは、呼び出しモジュールごとに少なくとも1つのdmesgを持つことでした。
答え3
/dev/urandom
従来との間の唯一の違いは、/dev/random
カーネルがシステムにエントロピーがないと思うときに発生することです(/dev/random
クローズ失敗、/dev/urandom
オープン失敗)。どちらのドライバもadd_disk_randomness()
、からadd_interrupt_randomness()
エントロピーを取得しますadd_input_randomness()
。/drivers/char/random.c
詳細より。
追加編集:Linux 4.8以降、/dev/urandom
CSPRNGを使用するように再設計されました。
それでは、いつ失敗を止めるべきですか?あらゆるタイプの暗号化の使用、特にDRBGシードに適しています。/dev/urandom
十分なエントロピーなしでRSAキーを生成するときにRSAキーを使用する結果を説明する非常に良い論文があります。読むあなたのPとQを探す。