web-dev-qa-db-ja.com

OpenSSLが/ dev / randomを直接使用できないのはなぜですか?

wiki ページで説明されていなくても、理由の答えがどこにも見つかりませんでした。これは、PRNGを使用して別のPRNGをシードするように見えます。最初のものは (/ dev/random) それ自体がPRNGによってシードされる場合があります。

私はできます「理解」なぜthe-Randoptionをキーの生成に直接使用することはできませんが、主なソースの理由がわかりません。多くの人が言う/dev/random十分な出力を生成しません。つまり、デーモンによってエントロピーが供給されている場合、wrongになります。

彼らは考慮します/dev/random高品質のソースではありませんか?

22
user2284570

デバイスからのバイトの読み取りは厄介である可能性があり(システムコールの中断など、syscallの特殊性を考慮する必要があります)、潜在的に多くの小さなチャンクを読み取る場合は非効率的です。 (syscallには無視できないオーバーヘッドがあります)。 /dev/urandomからのバイトを含むカスタムソフトウェアPRNGシードを使用すると、パフォーマンスをより詳細に制御できます。

(また、多少の [〜#〜] nih [〜#〜] シンドロームもここにあるかもしれません。)

19
Thomas Pornin

一般に、提示されているランダムソースを直接使用しない理由は次のとおりです。

  • 必要なビット数ほど多くのエントロピーを必要としない場合があります。この場合、ランダムビットを使用して疑似乱数ジェネレータをシードできます。これは、エントロピーが不足している場合に最も重要です(専用ハードウェアエントロピーソースが一般的になるにつれて、この制約は時間の経過とともに関連性が低くなります)。
  • ランダムなソースがランダムであることを信頼したくない。 /dev/urandom特に低エントロピー条件でブロックしないことを保証することで、出力が実際にランダムであることを保証できないため、特に信頼できません。マンページman 4 urandomこれに関する詳細情報があります。一部の政府機関がこの条件に基づいているかどうかにかかわらず、攻撃に対する謎めいた暗示を含みます。このデータに対して適合性テストを実行するか、エントロピーを集中させるために何らかの方法で変更するか、異なるソースを組み合わせることができます。
  • 乱数を生成する特定の方法が使用されたことを保証したいとします。これにより、Linuxカーネルの開発者に依頼することなく、これを義務付ける標準に準拠できます。

有効な鍵のサイズの概念(鍵で暗号化された既知の項目が与えられた場合に鍵を解読するための最適なアルゴリズムの反復回数の2を底とする対数)も考慮してください。明らかに、有効なキーサイズよりも多くのエントロピーを消費することに目的はありません。そうすることで、エントロピープールが枯渇するだけです。

2
Falcon Momot

ファルコンの優れた答えに加えて:

[colin@localhost ~]$ time dd if=/dev/random of=/dev/null iflag=fullblock count=10 bs=32
10+0 records in
10+0 records out
320 bytes (320 B) copied, 32.0067 s, 0.0 kB/s
0.00user 0.00system 0:32.00elapsed 0%CPU (0avgtext+0avgdata 3104maxresident)k
0inputs+0outputs (0major+249minor)pagefaults 0swaps

[colin@localhost ~]$ time dd if=/dev/urandom of=/dev/null iflag=fullblock count=10 bs=32
10+0 records in
10+0 records out
320 bytes (320 B) copied, 0.000289421 s, 1.1 MB/s
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3072maxresident)k
0inputs+0outputs (0major+247minor)pagefaults 0swaps

/ dev/randomは非常にランダムかもしれませんが、非常に遅いです!

1
symcbean