模块  java.base
软件包  java.security

Class DrbgParameters


  • public class DrbgParametersextends 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对象的参数和其他信息(例如,nonce,不由此API管理)来实例化DRBG实例。 这映射到Instantiate_function在NIST SP 800-90Ar1定义。

    可以使用DrbgParameters.Reseed对象中的参数重新植入DRBG实例。 这映射到Reseed_function在NIST SP 800-90Ar1定义。 调用SecureRandom.reseed()相当于使用有效的实例化预测电阻标志(由SecureRandom.getParameters()返回)调用SecureRandom.reseed(SecureRandomParameters) ,无需额外输入。

    DRBG实例使用来自DrbgParameters.NextBytes对象的其他参数生成数据。 这映射到Generate_function在NIST SP 800-90Ar1定义。 调用SecureRandom.nextBytes(byte[])相当于使用有效的实例化强度和预测电阻标志(由SecureRandom.getParameters()返回)调用SecureRandom.nextBytes(byte[], SecureRandomParameters)而没有额外输入。

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

    在另一方面,如果一个DRBG实现不包含具有一个构造DrbgParameters.Instantiation参数(不推荐),它只能通过选择SecureRandom.getInstance()没有SecureRandomParameters参数,但将不被选择,如果一个getInstance方法与SecureRandomParameters参数叫做。 如果以这种方式实现,其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实施命名为 standard SecureRandom algorithm name “DRBG”。
    Implementation Note:
    以下说明适用于JDK参考实现的SUN提供程序中的“DRBG”实现。

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

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

    对于每种组合,可以要求安全强度从112到它支持的最高强度。 支持重播和预测抗性。

    通过DrbgParameters.Instantiation类支持个性化字符串,并通过DrbgParameters.NextBytesDrbgParameters.Reseed类支持其他输入。

    如果未明确地使用DrbgParameters.Instantiation对象实例化DRBG ,则此实现使用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对象