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

クラスDrbgParameters


  • public class DrbgParameters
    extends Object
    このクラスは、DRBG (確定的ランダム・ビット発生器)によって使用されるパラメータを指定します。

    「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が実際にどのようにインスタンス化されるかを反映する有効でない有効なDrbgParameters.Instantiationオブジェクトを常に戻す必要があります。 呼び出し元は、この情報を使用して、SecureRandomオブジェクトがDRBGであるかどうか、およびそのオブジェクトがサポートする機能を判断できます。 戻り値は、必ずしもSecureRandom.getInstance()呼び出しに渡されるDrbgParameters.Instantiationオブジェクトと同じではありません。 たとえば、リクエストされた機能はDrbgParameters.Capability.NONEでもかまいませんが、実装が再シードをサポートしている場合、実効値はDrbgParameters.Capability.RESEED_ONLYになります。 実装では、DrbgParameters.NextBytesパラメータをとるSecureRandomSpi.engineNextBytes(byte[], SecureRandomParameters)メソッドを実装する必要があります。 SecureRandom.getParameters()の結果にそのcapabilityNONEの場合は、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)を呼び出すと、このシステムのデフォルト・エントロピ・ソースから直接読み込まれます。

    この実装は、20151104バージョンの「DRBGテスト・ベクトル」に含まれるすべてのテストに合格しています。

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

      • instantiation

        public static DrbgParameters.Instantiation instantiation​(int strength,
                                                                 DrbgParameters.Capability capability,
                                                                 byte[] personalizationString)
        DrbgParameters.Instantiationオブジェクトを生成します。
        パラメータ:
        strength - ビット単位のセキュリティ強度、getInstanceで使用される場合のデフォルト強度の-1。
        capability - 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オブジェクト