web-dev-qa-db-ja.com

コンピューターの乱数ジェネレーターを使用してキーを生成すると、安全ですか?

コンピューターの乱数ジェネレーターを使用して暗号化キーを生成すると、セキュリティリスクが発生しますか?もしそうなら、特に.NETでRSAキーペアを生成するときに、そのリスクはどのように軽減されますか?

11
broccoli_soup

コンピューターの乱数ジェネレーターを使用してキーを生成すると、安全ですか?

これは、脅威の環境、露出、およびシステム全体のセキュリティに依存します。堅牢で安全なシステムを実装することの難しさ、および保護しているものが(他の人にとって)価値が高くないと想定すると、自分のコンピューターを使用して乱数を生成することはおそらく問題ありません。ただし、システムへの脅威が高い場合、危険性が高い場合、または保護しているものの価値が高い場合、コンピューター生成の乱数を使用するのは安全ではありません。

コンピューターの乱数ジェネレーターを使用して暗号化キーを生成すると、セキュリティリスクが発生しますか?

はい、しかしそれはそれについて何かをするのに十分な重大なリスクではないかもしれません。答えの次の部分を参照してください。

もしそうなら、特に.NETでRSAキーペアを生成するときに、そのリスクはどのように軽減されますか?

RSA暗号化では、秘密鍵と公開鍵は数学的に関連しています。秘密鍵と公開鍵のペアを生成するには、乱数が必要です。攻撃者が鍵ペアと公開鍵を生成するために使用される乱数を持っている場合、攻撃者は秘密鍵を簡単に見つけることができます。

Microsoftの.Netフレームワークは、乱数生成用に RNGCryptoServiceProvide を提供します。すべてのソフトウェアベースの乱数ジェネレータは、実際には疑似乱数ジェネレータです。それらは真にランダムではないが、出力がランダムに見えるように出力を生成することを意味します。

すべてのソフトウェアは確定的です。つまり、特定の入力セットに対して、出力を正確に決定できます。これは、予測可能な出力を生成するため、prng(疑似乱数ジェネレータ)には適していません。つまり、出力は疑似ランダムでさえありません。この制限を乗り越えるには、prngがランダムデータをシードして開始する必要があります。

Prng関数に最初から少しランダムなデータを与えることにより、たくさんの疑似乱数を生成できます。ランダムシードデータを生成するには多くの方法があります。関数が呼び出された時間を使用する、初期化されていないメモリのブロックを読み取る、キーボードを押してからの平均時間、マウスの位置などを使用する。一般に、ランダムを生成するために使用されるデータ完全にランダムでもありません。

攻撃者が乱数の生成に使用されるアルゴリズムとシードデータを知っている場合、prngの可能な出力を削減し、削減された出力を使用して秘密鍵を簡単に見つけることができる可能性があります。

RNGCryptoServiceProvideで使用されているrpngアルゴリズムがわからないので、その有効性については説明できません。

乱数生成によるリスクを軽減するために、真のハードウェアベースの乱数ジェネレータを使用できます。ハードウェアベースの乱数ジェネレーターでは、アルゴリズムの代わりに物理プロセスを使用してデータを生成するため、シードは必要ありません。特定の物理プロセスには、ランダムまたはほぼランダムな特性があります。放射性粒子の減衰、サーマンノイズ、トランジスターの競合状態などです。ハードウェアベースの乱数ジェネレーターの出力は、コンピューターで生成された数値よりも統計的にランダムになります。さらに、コンピューターで使用可能な値を使用して出力が生成されることはありません。ただし、多くのハードウェア乱数ジェネレータは高価で低速です。

それで、お金とスピードのコストは投資の価値があるでしょうか?

それはあなたが何を保護しているのか、そしてあなたの攻撃者がどれほど巧妙で決定的であるかに依存します。

注:一部のコンピューターチップセットには、ハードウェア乱数ジェネレーターが含まれています。

16
this.josh

あなたがロンドンにいるなら、あなたは本当に dc4420.org 毎月の会合に今年来るべきでした!乱数発生器についての3つの話と私たちは6月だけです!

講演の1つは、IDQと、オンラインカジノおよびポーカーサイト(本当にランダム性を気にする人)の乱数ジェネレーターを調べるコンサルタントからのものでした。これは私が学んだことです:

  • ランダム性の優れたソースが得られたら、データをそのままにします」最小限に改ざんしたデータストリームは、ランダム性のパフォーマンスが最高でした
  • 「エントロピーをハッシュしないでください」。それがあなたのエントロピーを長くした場合、それをバイアグラと呼びます。ハッシュ関数ではありません。

乱数ジェネレーターに関しては、 Quantis 以外を調べる必要はありません。比較的安価で、高速で信頼性があります。それはジュネーブ政府によって使用されていると言っているIDQからです。

2番目に良いのは、ハードウェアベースのメカニズムです。煙探知器、ウェブカメラ、およびいくつかのpython(£20未満の場合))からの放射性線源のちょっとした楽しみについては、これをチェックしてください: http:// www.aperturelabs.com/smoke-rng/

注:これは楽しいハックです。放射性粒子間のタイミングであることが証明されたランダム性のソースを使用していないため、真にランダムではない可能性があります(おそらくソフトウェアよりもそうかもしれません)。本番での使用というよりは、楽しい実験として捉えるべきです。

乱数ジェネレーターの品質の評価:

最悪なのはソフトウェアベースの疑似乱数ジェネレーターで、CPU電流やより悪い時間などの「ランダム性」の準ソースを使用します。これらは、保護している資産と直面している脅威に問題がない場合にのみ使用してください。 Java Devランダム。

6
Rakkhi

一部のチップセットで利用可能なHW PRNGを意味していると思います。

一般に、OSのPRNG機能を使用する必要があります。これらは、優れたランダム性を生成しようとします。FreeBSDPRNGの設計に関する講演を見たことがありますチップセットのハードウェアPRNGが組み込まれているため、最悪の場合、ランダム性は追加されませんが、システムのPRNGが弱まることはありません。ただし、さらに多くのリソース/確認/一般化に感謝しますこの問題について。

TPMはHW PRNGも提供することに注意してください。 Googleがその使い方を教えてくれます。 「Linux Random Number Generatorの分析」にも、興味深いヒントがいくつかあります。

PRNGが信頼できない場合は、いくつかのPRNGテストスイートを実行してみてください。ただし、PRNGが本当に、ランダム、または疑似ランダムのみ。

4
pepe

この種のアプリケーション(かなり小さなキーを生成する)の最大の懸念は、PRNGに十分なエントロピーがシードされていない可能性があります-PRNGは予測可能であり、出力も予測可能です。おそらく、これの最も有名な最近の例は、OpenSSLのDebianバージョン(2006年9月から2008年5月13日まで)でした:使用された唯一のエントロピーソースは、生成プログラムなので、可能なキーは32,768しかありませんでした(そして、いくつかは他よりも可能性が高かった)(参照: Debian Security Advisory DSA-1571-1 と議論 here 。 )

これは孤立した事件ではありませんでした。 この参考文献 は、「実際のアプリケーション」で使用されるPRNGの重大な欠陥」セクションに4つの例を示します(10年以内に更新されたようには見えません)。別の例:Samy Kamkarは、PHP(バージョン5.3.2より前)のセッションキーを ブルートフォース可能にする にするために十分なエントロピーソースを発見する方法を示しました。

全体として、最善のアプローチは、注意を払っていると信頼できる開発者からの、鍵生成(特に、エントロピーコレクションを処理するもの)向けの乱数ジェネレータを使用することです。

3
Gordon Davisson