31

私たちのチームは、SecureRandom を使用して鍵ペアのリストを生成しています (SecureRandom は KeyPairGenerator に渡されます)。次の 2 つのオプションのどちらを使用するかについては、合意できません。

  1. キーペアを生成する必要があるたびに新しいインスタンスを作成する

  2. 静的インスタンスを初期化し、それをすべてのキー ペアに使用する

一般的にどのアプローチが優れているか、またその理由は?

追加: 私の直感では、2 番目のオプションの方が安全です。しかし、私の唯一の議論は、疑似ランダム性が現在のタイムスタンプから導出されるという仮定に基づく理論的な攻撃です。誰かがキーペアの作成時間を見て、周囲の時間間隔でタイムスタンプを推測し、可能な疑似乱数シーケンスを計算し、キー素材。

追加: タイムスタンプに基づく決定論に関する私の仮定は間違っていました。それが、Random と SecureRandom の違いです。したがって、答えは次のようになります。セキュリティの観点からは、それほど重要ではありません。

4

8 に答える 8

18

クラスとは異なり、java.util.Randomクラスはjava.security.SecureRandom呼び出しごとに非決定論的な出力を生成する必要があります。

つまり、 の場合java.util.Random、新しい乱数が必要になるたびに同じシードでインスタンスを再作成すると、基本的に毎回同じ結果が得られます。ただし、SecureRandomはそうしないことが保証されています。そのため、単一のインスタンスを作成したり、毎回新しいインスタンスを作成したりしても、生成されるランダム バイトのランダム性には影響しません。

では、通常の優れたコーディング プラクティスの観点からすると、インスタンスを作成する必要があるのに、なぜインスタンスを作成しすぎるのでしょうか?

于 2008-11-17T14:15:07.130 に答える
17

SecureRandomの場合、次のような呼び出しを介して、 (ほとんどの場合システム エントロピーを使用して)時々再シードすることを検討する必要があります。

mySecureRandom.setSeed(mySecureRandom.generateSeed(someInt));

潜在的な攻撃者にあなたの鍵を発見するための無制限の時間を与えないようにするためです。

ジャスティス リーグのブログには、この考慮事項に関する優れた記事がいくつかあります。

于 2010-07-19T04:08:34.877 に答える
6

静的インスタンスを初期化し、それをすべてのキー ペアに使用します。多かれ少なかれランダムではありません。

于 2008-11-17T14:07:33.027 に答える
5

すべてのSecureRandom世代は、何らかのエントロピー プールからシードされます。使用する OS に応じて、これは/dev/randomLinux のように OS によって維持されるエントロピー プールである場合もあれば、JVM が調理するものである場合もあります。一部の以前の実装では、Sun JVM は多数のスレッドを生成し、それらのタイミング データを使用してシードを作成していました。

シードの作成がブロックされる可能性があるため、すべての呼び出しで新しいSecureRandomを作成すると、アプリケーションの速度が低下する可能性があります。静的に作成されたインスタンスを再利用することをお勧めしますが、固定数のランダム バイトが抽出された後に再シードしてください。

または呼び出しでSecureRandom抽出されたバイト数をカウントし、一定のバイト数が経過した後、システム エントロピー プールを使用して内部インスタンスを再シードするインスタンスのラッパーを作成することができます。nextBytesgenerateSeedSecureRandom

SecureRandomただし、new から取得したインスタンスSecureRandom()はラッパーにすぎず、OS エントロピー プール/dev/randomを呼び出すたびに、nextBytesまたは実際にドレインするため、ラッパー アプローチは Linux 上の Java では使用できません。generateSeedLinux および Solaris では、作成に JCE プロバイダーを使用することをお勧めしますSecureRandom

于 2009-08-20T09:10:13.553 に答える
3

私は SecureRandom が暗号的に安全な PRNG 以外のものであるとは考えていません。Gowri が javadocs から使用している完全な引用は次のとおりです。

さらに、SecureRandom は非決定論的な出力を生成する必要があるため、RFC 1750: Randomness Recommendations for Security で説明されているように、シード マテリアルが予測不可能であり、SecureRandom の出力が暗号的に強力なシーケンスである必要があります。

RFC 1750 では、ハードウェアを使用して乱数生成を強化することが詳細に説明されていますが、javadoc には「したがって、シード マテリアルが予測不可能であることが必要である」と記載されており、これは矛盾しているように見えます。

作業する上で最も安全な仮定は、SecureRandom の実装は単に暗号的に安全な PRNG であり、したがって、キーは使用するランダム シードよりも安全ではないということです。したがって、キーごとに新しい (一意の、真にランダムな) シードを使用して新しい SecureRandom を初期化するのが最も安全な方法です。

于 2008-11-17T17:14:20.857 に答える
1

一度で十分です。私の経験では、SecureRandom 型ジェネレーターの初期化も (ランダム性の達成方法により) 遅くなる場合があるため、それを考慮する必要があります。

于 2008-11-17T19:08:50.940 に答える
-1

毎回新しいインスタンスを作成する必要があるのはなぜですか? それがよりランダムになるというわけではありません。一度初期化して、すべてのペアに使用するのが最善だと思います。

于 2008-11-17T14:05:19.757 に答える