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

クラスDrbgParameters


  • public class DrbgParameters
    extends Object
    このクラスは、DRBG (Deterministic Random Bit Generator)で使用されるパラメータを指定します。

    NIST Special Publication 800-90A Revision 1、 Recommendation for Random Number Generation Using Deterministic Random Bit Generators (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.reseed(SecureRandomParameters)を(SecureRandom.getParameters()によって返された)有効なインスタンス化された予測抵抗フラグを使用して追加入力なしで呼び出すことと同じです。

    DRBGインスタンスは、DrbgParameters.NextBytesオブジェクトから追加パラメータを使用してデータを生成します。 これは、NIST SP 800-90Ar1で定義されているGenerate_functionにマップされます。 SecureRandom.nextBytes(byte[])の呼出しは、SecureRandom.nextBytes(byte[], SecureRandomParameters)を(SecureRandom.getParameters()によって返された)有効なインスタンス化された強度および予測抵抗フラグを使用して追加入力なしで呼び出すことと同等です。

    DRBGは、SecureRandomSpiのサブクラスとして実装する必要があります。 実装には、DrbgParameters.Instantiation引数を取る1つの引数コンストラクタを含めることをお薦めします。 この方法で実装した場合、この実装は任意の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()の結果の機能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アルゴリズムAES-128、AES-192およびAES-256を使用して、DRBGアルゴリズムSHA-224、SHA-512/224、SHA-256、SHA-512/256、SHA-384およびSHA-512およびCTR_DRBG (導出関数を使用せず、導出関数を使用)を使用したHash_DRBGおよびHMAC_DRBGメカニズムがサポートされます。

    メカニズム名と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)を呼び出すと、このシステムのデフォルトのエントロピ・ソースから直接読み取られます。

    この実装は、The DRBG Test Vectorsの20151104バージョンに含まれるすべてのテストに合格しました。

    導入されたバージョン:
    9
    • メソッドの詳細

      • instantiation

        public static DrbgParameters.Instantiation instantiation​(int strength,
                                                                 DrbgParameters.Capability capability,
                                                                 byte[] personalizationString)
        DrbgParameters.Instantiationオブジェクトを生成します。
        パラメータ:
        strength - セキュリティ強度(ビット単位)、デフォルトの強度(getInstanceで使用する場合) -1。
        capability - 機能
        personalizationString - バイト配列としてのパーソナライズ文字列で、nullにできます。 このバイト配列の内容がコピーされます。
        戻り値:
        新しいInstantiationオブジェクト
        例外:
        NullPointerException - capabilitynullの場合
        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オブジェクト