「NISTスペシャル・パブリケーション800-90Aリビジョン1、決定論的ランダム・ビット・ジェネレータを使用した乱数生成の推奨事項」 (800-90Ar1)によると、
DRBGは、この推奨事項で指定されたDRBGメカニズムに基づいており、ランダム性のソースが含まれています。 DRBG機構は、ランダム性源の出力から決定されるシードによって決定される初期値からのビット列を生成するアルゴリズム(DRBGアルゴリズム)を使用します。
800-90Ar1仕様では、次のような様々なDRBG実装を選択できます:
- エントロピ源、
- DRBG機構(たとえば、Hash_DRBGです)、
- DRBGアルゴリズム(たとえば、Hash_DRBGの場合はSHA-256、CTR_DRBGの場合はAES-256)。 これは、次の「SecureRandomアルゴリズム」をコールする
SecureRandom.getInstance(java.lang.String)
で使用されるアルゴリズムではないことに注意してください)。 - 予測抵抗やサポートなどのオプション機能、
- 最高のセキュリティ強度。
これらの選択肢は各実装で設定され、SecureRandom
APIによって直接管理されるわけではありません。 DRBGプロバイダのドキュメントを確認して、状況に適した実装を見つけてください。
一方、800-90Ar1仕様には、次のような構成可能なオプションがあります:
- 必要なセキュリティ強度、
- 予測抵抗が必要な場合、
- パーソナライズ文字列と追加入力。
DRBGインスタンスは、DrbgParameters.Instantiation
オブジェクトのパラメータおよびその他の情報(たとえば、このAPIによって管理されていないnonce)を使用してインスタンス化できます。 これは、NIST SP 800-90Ar1で定義されたInstantiate_function
にマップされます。
DRBGインスタンスは、DrbgParameters.Reseed
オブジェクトからのパラメータで再シードできます。 これは、NIST SP 800-90Ar1で定義されたReseed_function
にマップされます。 SecureRandom.reseed()
をコールすることは、追加の入力なしで有効なインスタンス化された予測抵抗フラグ(SecureRandom.getParameters()
によって返される)を使用してSecureRandom.reseed(SecureRandomParameters)
をコールすることと同じです。
DRBGインスタンスは、DrbgParameters.NextBytes
オブジェクトからの追加パラメータを使用してデータを生成します。 これは、NIST SP 800-90Ar1で定義されたGenerate_function
にマップされます。 SecureRandom.nextBytes(byte[])
をコールすることは、追加の入力なしで有効なインスタンス化された強度および予測抵抗フラグ(SecureRandom.getParameters()
によって返される)を使用してSecureRandom.nextBytes(byte[], SecureRandomParameters)
をコールすることと同じです。
DRBGはSecureRandomSpi
のサブクラスとして実装する必要があります。 実装には、DrbgParameters.Instantiation
引数を取る1つの引数constructorを含めることをお薦めします。 この方法で実装される場合、この実装は任意のSecureRandom.getInstance()
メソッドで選択できます。 SecureRandomParameters
パラメータを持つSecureRandom.getInstance()
によって選択されている場合、このパラメータはこのコンストラクタに渡されます。 SecureRandomParameters
パラメータを指定せずにSecureRandom.getInstance()
によって選択された場合、コンストラクタはnull
引数を使用してコールされ、実装は独自のパラメータを選択する必要があります。 そのSecureRandom.getParameters()
は、DRBGが実際にインスタンス化される方法を反映するnull以外の有効なDrbgParameters.Instantiation
オブジェクトを常に返す必要があります。 呼出し側は、この情報を使用して、SecureRandom
オブジェクトがDRBGであるかどうか、およびどの機能をサポートしているかを判断できます。 戻り値は、必ずしもSecureRandom.getInstance()
コールに渡されたDrbgParameters.Instantiation
オブジェクトと等しくないことに注意してください。 たとえば、リクエストされた機能はDrbgParameters.Capability.NONE
ですが、実装でリ・シードがサポートされている場合、有効な値はDrbgParameters.Capability.RESEED_ONLY
になります。 実装では、DrbgParameters.NextBytes
パラメータを使用するSecureRandomSpi.engineNextBytes(byte[], SecureRandomParameters)
メソッドを実装する必要があります。 SecureRandom.getParameters()
の結果のcapabilityがNONE
である場合を除き、DrbgParameters.Reseed
パラメータを使用するSecureRandomSpi.engineReseed(SecureRandomParameters)
を実装する必要があります。
一方、DRBG実装にDrbgParameters.Instantiation
引数(推奨されていません)を持つコンストラクタが含まれていない場合、SecureRandomParameters
パラメータを持たないSecureRandom.getInstance()
によってのみ選択できますが、SecureRandomParameters
パラメータを持つgetInstance
メソッドがコールされた場合は選択されません。 この方法で実装した場合、そのSecureRandom.getParameters()
はnull
を返す必要があり、SecureRandomSpi.engineNextBytes(byte[], SecureRandomParameters)
またはSecureRandomSpi.engineReseed(SecureRandomParameters)
を実装する必要はありません。
DRBGメカニズムで定義された最大シード存続期間よりもシード期間が大きい場合、DRBGは自動的に再シードされることがあります。
DRBG実装では、構成および実効パラメータを保持することによって直列化および直列化復元をサポートする必要がありますが、内部状態を直列化しておらず、直列化復元されたオブジェクトを再インスタンス化する必要があります。
例
SecureRandom drbg; byte[] buffer = new byte[32]; // Any DRBG is OK drbg = SecureRandom.getInstance("DRBG"); drbg.nextBytes(buffer); SecureRandomParameters params = drbg.getParameters(); if (params instanceof DrbgParameters.Instantiation) { DrbgParameters.Instantiation ins = (DrbgParameters.Instantiation) params; if (ins.getCapability().supportsReseeding()) { drbg.reseed(); } } // The following call requests a weak DRBG instance. It is only // guaranteed to support 112 bits of security strength. drbg = SecureRandom.getInstance("DRBG", DrbgParameters.instantiation(112, NONE, null)); // Both the next two calls will likely fail, because drbg could be // instantiated with a smaller strength with no prediction resistance // support. drbg.nextBytes(buffer, DrbgParameters.nextBytes(256, false, "more".getBytes())); drbg.nextBytes(buffer, DrbgParameters.nextBytes(112, true, "more".getBytes())); // The following call requests a strong DRBG instance, with a // personalization string. If it successfully returns an instance, // that instance is guaranteed to support 256 bits of security strength // with prediction resistance available. drbg = SecureRandom.getInstance("DRBG", DrbgParameters.instantiation( 256, PR_AND_RESEED, "hello".getBytes())); // Prediction resistance is not requested in this single call, // but an additional input is used. drbg.nextBytes(buffer, DrbgParameters.nextBytes(-1, false, "more".getBytes())); // Same for this call. drbg.reseed(DrbgParameters.reseed(false, "extra".getBytes()));
- 実装要件:
- 通常、プロバイダは、プライマリDRBG実装に「標準
SecureRandom
アルゴリズム名」 "DRBG"という名前を付ける必要があります。 - 実装上のノート:
- 次のノートは、JDKリファレンス実装のSUNプロバイダの"DRBG"実装に適用されます。
この実装では、DRBGアルゴリズムSHA-224、SHA-512/224、SHA-256、SHA-512/256、SHA-384およびSHA-512を使用したHash_DRBGおよびHMAC_DRBGメカニズム、およびDRBGアルゴリズムAES-128、AES-192およびAES-256を使用したCTR_DRBG (導関数を使用し、導関数を使用しない)がサポートされます。
メカニズム名とDRBGアルゴリズム名は、「セキュリティ・プロパティ」
securerandom.drbg.config
によって決定されます。 デフォルトの選択はSHA-256のHash_DRBGです。組み合わせごとに、セキュリティ強度を112からサポートする最高強度までリクエストできます。 再シード抵抗と予測抵抗の両方がサポートされています。
パーソナライズ文字列は
DrbgParameters.Instantiation
クラスでサポートされ、追加入力はDrbgParameters.NextBytes
クラスおよびDrbgParameters.Reseed
クラスでサポートされます。DRBGが
DrbgParameters.Instantiation
オブジェクトで明示的にインスタンス化されていない場合、この実装は、デフォルトの要求強度128ビット、予測抵抗リクエストおよびパーソナライズ文字列なしで、DRBGをインスタンス化します。 これらのデフォルトのインスタンス化パラメータは、securerandom.drbg.config
セキュリティ・プロパティを使用してカスタマイズすることもできます。この実装は、セキュリティ・プロパティ
securerandom.source
によって決定されるシステムのデフォルト・エントロピ・ソースから新鮮なエントロピを読み込みます。SecureRandom.generateSeed(int)
をコールすると、このシステムのデフォルトのエントロピ・ソースから直接読み取られます。 - 導入されたバージョン:
- 9
-
ネストされたクラスのサマリー
修飾子と型クラス説明static enum
DRBGの再シード可能および予測抵抗機能。static final class
インスタンス化のためのDRBGパラメータ。static final class
ランダム・ビット生成用のDRBGパラメータ。static final class
リ・シード用のDRBGパラメータ。 -
メソッドのサマリー
修飾子と型メソッド説明static DrbgParameters.Instantiation
instantiation
(int strength, DrbgParameters.Capability capability, byte[] personalizationString) DrbgParameters.Instantiation
オブジェクトを生成します。static DrbgParameters.NextBytes
nextBytes
(int strength, boolean predictionResistance, byte[] additionalInput) DrbgParameters.NextBytes
オブジェクトを生成します。static DrbgParameters.Reseed
reseed
(boolean predictionResistance, byte[] additionalInput) DrbgParameters.Reseed
オブジェクトを生成します。
-
メソッドの詳細
-
instantiation
public static DrbgParameters.Instantiation instantiation(int strength, DrbgParameters.Capability capability, byte[] personalizationString) DrbgParameters.Instantiation
オブジェクトを生成します。- パラメータ:
strength
- セキュリティ強度(ビット単位)、デフォルトの強度(getInstance
で使用する場合)は -1。capability
- capabilitypersonalizationString
- バイト配列としてのパーソナライズ文字列は、null
です。 このバイト配列の内容がコピーされます。- 戻り値:
- 新しい
Instantiation
オブジェクト - 例外:
NullPointerException
-capability
がnull
の場合IllegalArgumentException
-strength
が -1より小さい場合
-
nextBytes
public static DrbgParameters.NextBytes nextBytes(int strength, boolean predictionResistance, byte[] additionalInput) DrbgParameters.NextBytes
オブジェクトを生成します。- パラメータ:
strength
- ビットのセキュリティの強さをリクエストしました。 -1に設定すると、有効な強度が使用されます。predictionResistance
- 予測抵抗リクエストadditionalInput
- 追加入力は、null
です。 このバイト配列の内容がコピーされます。- 戻り値:
- 新しい
NextBytes
オブジェクト - 例外:
IllegalArgumentException
-strength
が -1より小さい場合
-
reseed
public static DrbgParameters.Reseed reseed(boolean predictionResistance, byte[] additionalInput) DrbgParameters.Reseed
オブジェクトを生成します。- パラメータ:
predictionResistance
- 予測抵抗リクエストadditionalInput
- 追加入力は、null
です。 このバイト配列の内容がコピーされます。- 戻り値:
- 新しい
Reseed
オブジェクト
-