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
との類推を考えてみましょう :これは反復子の順序付けを保証しません。ただし、LinkedHashSet
、 HashSet
のサブクラス する イテレータの順序を保証します。 LinkedHashSet
の保証 HashSet
の保証と一致しています 、特定の順序のため は、「順序が保証されていない」場合に見られる可能性のある順序の 1 つです (結局のところ、some で要素を返す必要があります)。 注文)
同様に、Random
返される int のシーケンスのセキュリティについては保証しません。 SecureRandom
より強力な保証を行います。しかし、SecureRandom
からの int のシーケンスに理由はありません。 Random
によって返されることもありません 、偶然です。
はい、SecureRandom
暗号的に強力な乱数ジェネレーター (RNG) を提供します。
安全な RNG の重要な要素の 1 つはシードです。
したがって、SecureRandom オブジェクトに渡されるシード マテリアルは予測不可能である必要があり、すべての SecureRandom 出力シーケンスは、RFC 4086:セキュリティのランダム性要件で説明されているように、暗号的に強力である必要があります。
さあ、それを使ってください。詳細に興味がある場合は、実装で使用されるさまざまなアプローチについて説明している JavaDoc をお読みください。