モジュール java.base
パッケージ java.security

クラスSecureRandom

java.lang.Object
java.util.Random
java.security.SecureRandom
すべての実装されたインタフェース:
Serializable, RandomGenerator

public class SecureRandom extends Random
このクラスは暗号用に強化された乱数ジェネレータ(RNG)を提供します。

強力な暗号化による乱数は、「FIPS 140-2, Security Requirements for Cryptographic Modules」のセクション4.9.1に指定されている統計的乱数生成テストに最低限適合しています。 また、SecureRandomは非決定的な出力を生成する必要があります。 したがって、SecureRandomオブジェクトに渡されるシード・マテリアルは予測できない必要があり、RFC 4086: セキュリティのランダム性要件で説明されているように、すべてのSecureRandom出力シーケンスは暗号的に強力である必要があります。

多くのSecureRandom実装は、疑似乱数ジェネレータ(PRNG(deterministic random bits generator、DRBGとも呼ばれる))の形式です。これは、決定的アルゴリズムを使用してランダム・シードから疑似乱数シーケンスを生成することを意味します。 実装の中には、真の乱数を生成するものもあれば、両方の技術の組み合わせを使用するものもあります。

呼出し側は、引数なしコンストラクタまたはgetInstanceメソッドのいずれかを介してSecureRandomインスタンスを取得します。 たとえば、

 SecureRandom r1 = new SecureRandom();
 SecureRandom r2 = SecureRandom.getInstance("NativePRNG");
 SecureRandom r3 = SecureRandom.getInstance("DRBG",
         DrbgParameters.instantiation(128, RESEED_ONLY, null));

前述の3番目の文は、特定のインスタンス化パラメータをサポートする特定のアルゴリズムのSecureRandomオブジェクトを返します。 実装の有効なインスタンス化パラメータは、この最小リクエストと一致する必要がありますが、必ずしも同じではありません。 たとえば、リクエストに特定の機能が必要ない場合でも、実際のインスタンス化でその機能を提供できます。 実装は、実際に使用されるまでSecureRandomを遅延的にインスタンス化できますが、有効なインスタンス化パラメータは作成直後に決定する必要があり、getParameters()は常に同じ結果を変更せずに返す必要があります。

SecureRandomの典型的な呼び出し元は、以下のメソッドを呼び出してランダムなバイトを取得します:

 SecureRandom random = new SecureRandom();
 byte[] bytes = new byte[20];
 random.nextBytes(bytes);

呼び出し側は、generateSeed(int)メソッドを呼び出して、指定された数のシード・バイトを生成することもできます。(他の乱数ジェネレータをシード):

 byte[] seed = random.generateSeed(20);

新しく作成されたPRNG SecureRandomオブジェクトは、(SecureRandom(byte[])によって作成されている場合を除き)にシードされません。 nextBytesへの最初のコールは、実装固有のエントロピ・ソースから自身を強制的にシードします。 setSeedが以前に呼び出されている場合、この自己シードは行われません。

SecureRandomは、reseedまたはsetSeedメソッドをコールして、いつでも再シードできます。 reseedメソッドは、エントロピ・ソースからエントロピ入力を読み取り、自身をリ・シードします。 setSeedメソッドでは、コール元がシードを提供する必要があります。

reseedは、すべてのSecureRandom実装でサポートされない場合があります。

一部のSecureRandom実装では、メソッドの動作をさらに制御するために、nextBytes(byte[], SecureRandomParameters)メソッドおよびreseed(SecureRandomParameters)メソッドでSecureRandomParametersパラメータを使用できます。

ノート: 実装によっては、generateSeedreseedおよびnextBytesメソッドが、たとえば、様々なUnixに似たオペレーティング・システムでエントロピ・ソースが/dev/randomの場合に、エントロピが収集されるとブロックされることがあります。

スレッドの安全性

SecureRandomオブジェクトは、複数の同時スレッドで安全に使用できます。
実装要件:
SecureRandomサービス・プロバイダは、プロバイダの登録時に「サービス・プロバイダ属性」 "ThreadSafe"を"true"に設定することで、それがスレッド・セーフであることを通知できます。 それ以外の場合、このクラスはかわりに、SecureRandomSpi実装の次のメソッドへのアクセスを同期します:
導入されたバージョン:
1.1
関連項目: