Java >> Java チュートリアル >  >> Java

SecureRandom.ints() は安全ですか?

はい、安全です。

java.util.Random のコード検討 ints() であることを示しています internalNextInt(...) を使用するスプリッテレータを作成します ランダムな整数を生成します。それは次に nextInt() を呼び出します this で . java.security.SecureRandomの場合 、 nextInt() 「安全な」乱数を生成するためにオーバーライドされます 1 .

これは、ソース コードを見て自分で確認できます。

1 - もちろん、整数または整数のシーケンスを「セキュア」と呼ぶのは実際には意味がありません。また、必要なプロパティが SecureRandom にない場合もあります。 (これは、クラスで使用される実際の RNG または PRNG 実装、提供されたシードまたはシステム提供のエントロピー ソースの品質などに依存します。) しかし、SecureRandom::ints() は、同じプロパティを持つ一連の整数を生成します。同じオブジェクトに対して一連の SecureRandom::nextInt() 呼び出しを行ったかのように。後者のシーケンスが目的に適している場合 (それが何であれ)、前者も同様です。


Random.ints() IntStream を返すメソッドです . IntStream 安全でもなく安全でもない:それは数字の流れです.

メソッドによって返される一連の int の「セキュリティ」は、メソッドの実装によって異なります。 SecureRandom Random よりも安全に「ランダムな」値を生成します .これらは同じ API を共有しているため、要件に応じて、特定のコンテキストでいずれかを使用できます。

したがって、安全でないクラスから継承するという事実は、セキュリティとは無関係です:SecureRandom が クラスは、ドキュメントに記載されているとおり安全です。

HashSet との類推を考えてみましょう :これは反復子の順序付けを保証しません。ただし、LinkedHashSetHashSet のサブクラス する イテレータの順序を保証します。 LinkedHashSetの保証 HashSet の保証と一致しています 、特定の順序のため は、「順序が保証されていない」場合に見られる可能性のある順序の 1 つです (結局のところ、some で要素を返す必要があります)。 注文)

同様に、Random 返される int のシーケンスのセキュリティについては保証しません。 SecureRandom より強力な保証を行います。しかし、SecureRandom からの int のシーケンスに理由はありません。 Random によって返されることもありません 、偶然です。


はい、SecureRandom

暗号的に強力な乱数ジェネレーター (RNG) を提供します。

安全な RNG の重要な要素の 1 つはシードです。

したがって、SecureRandom オブジェクトに渡されるシード マテリアルは予測不可能である必要があり、すべての SecureRandom 出力シーケンスは、RFC 4086:セキュリティのランダム性要件で説明されているように、暗号的に強力である必要があります。

さあ、それを使ってください。詳細に興味がある場合は、実装で使用されるさまざまなアプローチについて説明している JavaDoc をお読みください。


Java タグ