「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 enumDRBGの再シード可能および予測抵抗機能。static final classインスタンス化のためのDRBGパラメータ。static final classランダム・ビット生成用のDRBGパラメータ。static final classリ・シード用のDRBGパラメータ。 -
メソッドのサマリー
修飾子と型メソッド説明static DrbgParameters.Instantiationinstantiation(int strength, DrbgParameters.Capability capability, byte[] personalizationString) DrbgParameters.Instantiationオブジェクトを生成します。static DrbgParameters.NextBytesnextBytes(int strength, boolean predictionResistance, byte[] additionalInput) DrbgParameters.NextBytesオブジェクトを生成します。static DrbgParameters.Reseedreseed(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オブジェクト
-