public class DrbgParameters extends Object
「NIST Special Publication 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.getInstance(java.lang.String)
で使用されているアルゴリズムではないことに注意してください。これは、以下では「SecureRandomアルゴリズム」と呼びます)。 - 予測抵抗および再シード・サポートを含むオプションの機能、
- 最高のセキュリティ強度。
これらの選択肢は各実装で設定され、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-arg constructorが含まれることをお勧めします。 このように実装された場合、この実装は任意のSecureRandom.getInstance()
メソッドで選択できます。 SecureRandom.getInstance()
でSecureRandomParameters
パラメータを指定すると、このコンストラクタにパラメータが渡されます。 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()));
- 実装要件:
- 慣例により、プロバイダは1次DRBG実装を「標準
SecureRandom
アルゴリズム名」 "DRBG"で名前を付ける必要があります。 - 実装上の注意:
- 以下の注意事項は、JDKリファレンス実装のSUNプロバイダの"DRBG"実装に適用されます。
この実装は、DRBGアルゴリズムAES-128、AESのDRBGアルゴリズムSHA-224、SHA-512/224、SHA-256、SHA-512/256、SHA-384およびSHA-512、およびCTR_DRBG (導関数を使用し、導関数を使用しない)でHash_DRBGおよびHMAC_DRBGメカニズムをサポートします。-192およびAES-256。
メカニズム名とDRBGアルゴリズム名は、「セキュリティ・プロパティ」
securerandom.drbg.config
によって決定されます。 デフォルトの選択はSHA-256のHash_DRBGです。各組み合わせについて、セキュリティ強度は、それがサポートする最高強度まで112からリクエストすることができます。 再シーミング抵抗と予測抵抗の両方がサポートされています。
パーソナライゼーション文字列は
DrbgParameters.Instantiation
クラスでサポートされ、追加の入力はDrbgParameters.NextBytes
クラスとDrbgParameters.Reseed
クラスでサポートされています。DRBGが
DrbgParameters.Instantiation
オブジェクトで明示的にインスタンス化されていない場合、この実装は128ビットのデフォルト・リクエスト強度、予測抵抗リクエストなし、およびパーソナライズ文字列なしでインスタンス化します。 これらのデフォルトのインスタンス化パラメータは、securerandom.drbg.config
セキュリティ・プロパティでカスタマイズすることもできます。この実装は、セキュリティ・プロパティ
securerandom.source
によって決定されるシステムのデフォルト・エントロピ・ソースから新鮮なエントロピを読み込みます。SecureRandom.generateSeed(int)
を呼び出すと、このシステムのデフォルト・エントロピ・ソースから直接読み込まれます。 - 導入されたバージョン:
- 9
-
ネストされたクラスのサマリー
ネストされたクラス 修飾子と型 クラス 説明 static class
DrbgParameters.Capability
DRBGの再シード可能および予測抵抗能力。static class
DrbgParameters.Instantiation
インスタンス化のDRBGパラメータ。static class
DrbgParameters.NextBytes
ランダム・ビット生成のためのDRBGパラメータ。static class
DrbgParameters.Reseed
再シードの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
オブジェクト
-