Module  java.base
软件包  java.security

Class DrbgParameters



  • public class DrbgParameters
    extends Object
    该类指定DRBG(确定性随机位发生器)使用的参数。

    根据NIST Special Publication 800-90A Revision 1, Recommendation for Random Number Generation Using Deterministic Random Bit Generators (800-90Ar1),

    A DRBG is based on a DRBG mechanism as specified in this Recommendation and includes a source of randomness. A DRBG mechanism uses an algorithm (i.e., a DRBG algorithm) that produces a sequence of bits from an initial value that is determined by a seed that is determined from the output of the randomness source."

    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规范确实有一些可配置的选项,如:

    • 要求安全实力,
    • 如果需要预测电阻,
    • 个性化字符串和附加输入。

    可以使用DrbgParameters.Instantiation对象和其他信息(例如,不由此API管理的随机数)的参数来实例化DRBG实例。 这映射到Instantiate_function在NIST SP 800-90Ar1定义。

    可以使用DrbgParameters.Reseed对象的参数重新设置DRBG实例。 这映射到Reseed_function在NIST SP 800-90Ar1定义。 主叫SecureRandom.reseed()等效于调用SecureRandom.reseed(SecureRandomParameters)与有效实例化的预测性标记(如通过返回SecureRandom.getParameters() ),没有附加的输入。

    DRBG实例使用DrbgParameters.NextBytes对象的附加参数生成数据。 这映射到Generate_function在NIST SP 800-90Ar1定义。 主叫SecureRandom.nextBytes(byte[])等效于调用SecureRandom.nextBytes(byte[], SecureRandomParameters)与有效实例化的强度和预测性标志(如通过返回SecureRandom.getParameters() ),没有附加的输入。

    DRBG应作为SecureRandomSpi的子类实现 建议实现包含一个DrbgParameters.Instantiation参数的1-arg constructor 如果这样实现,这个实现可以通过任何SecureRandom.getInstance()方法来选择。 如果由具有SecureRandomParameters参数的SecureRandom.getInstance()选择,则将该参数传递到此构造函数中。 如果由SecureRandom.getInstance()选择了SecureRandomParameters参数,则构造函数将使用一个null参数调用,并且实现应选择其自己的参数。 SecureRandom.getParameters()必须始终返回一个非空有效的DrbgParameters.Instantiation对象,反映DRBG实际上如何实例化。 呼叫者可以使用此信息来确定SecureRandom对象是否是DRBG,以及它支持哪些功能。 请注意,返回的值不一定等于传递到SecureRandom.getInstance()调用的DrbgParameters.Instantiation对象。 例如,所请求的能力可以是DrbgParameters.Capability.NONE但是如果实现支持重新加载,则有效值可以是DrbgParameters.Capability.RESEED_ONLY 实施必须实现DrbgParameters.NextBytes参数的SecureRandomSpi.engineNextBytes(byte[], SecureRandomParameters)方法。 除非结果SecureRandom.getParameters()有其capabilityNONE ,它必须实现SecureRandomSpi.engineReseed(SecureRandomParameters) ,这需要DrbgParameters.Reseed参数。

    另一方面,如果DRBG实现不包含具有DrbgParameters.Instantiation参数(不推荐)的DrbgParameters.Instantiation函数,则只能由SecureRandom.getInstance()选择而不具有SecureRandomParameters参数,但如果具有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()));
    实现要求:
    按照惯例,提供商应使用 standard SecureRandom algorithm name “DRBG”命名其主要DRBG实现。
    Implementation Note:
    以下注释适用于JDK参考实现的SUN提供程序中的“DRBG”实现。

    该实现支持具有DRBG算法SHA-224,SHA-512/224,SHA-256,SHA-512/256,SHA-384和SHA-512的Hash_DRBG和HMAC_DRBG机制以及CTR_DRBG(均使用推导函数而不使用派生功能)与DRBG算法AES-128,AES-192和AES-256。

    机制名称和DRBG算法名称由security property securerandom.drbg.config确定。 默认选项是具有SHA-256的Hash_DRBG。

    对于每个组合,可以从112请求到其支持的最高强度的安全强度。 支持反馈和预测电阻。

    通过DrbgParameters.Instantiation类支持个性化字符串,通过DrbgParameters.NextBytesDrbgParameters.Reseed类支持额外的输入。

    如果DRBG未被明确地用DrbgParameters.Instantiation对象实例化,则该实现将以128位的默认请求强度,无预测阻力请求,无个性化字符串实例化。 这些默认实例化参数也可以使用securerandom.drbg.config安全属性进行自定义。

    该实现从由安全属性securerandom.source确定的系统默认熵源读取新鲜熵。

    调用SecureRandom.generateSeed(int)将直接从该系统读取默认熵源。

    此实施已通过20151104版本的The DRBG Test Vectors中包含的所有测试。

    从以下版本开始:
    9
    • 方法详细信息

      • 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对象