- java.lang.Object
-
- java.security.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
对象的参数和其他信息(例如,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()
都有capability为NONE
,它必须实现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.NextBytes
和DrbgParameters.Reseed
类支持其他输入。如果未明确地使用
DrbgParameters.Instantiation
对象实例化DRBG ,则此实现使用128位的默认请求强度,没有预测阻抗请求以及没有个性化字符串来实例化它。 也可以使用securerandom.drbg.config
安全属性自定义这些默认实例化参数。此实现从安全属性
securerandom.source
确定的系统默认熵源中读取新熵。调用
SecureRandom.generateSeed(int)
将直接从该系统读取默认熵源。此实现已通过20151104版本The DRBG Test Vectors中包含的所有测试。
- 从以下版本开始:
- 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)
static DrbgParameters.NextBytes
nextBytes(int strength, boolean predictionResistance, byte[] additionalInput)
static DrbgParameters.Reseed
reseed(boolean predictionResistance, byte[] additionalInput)
-
-
-
方法详细信息
-
instantiation
public static DrbgParameters.Instantiation instantiation(int strength, DrbgParameters.Capability capability, byte[] personalizationString)
- 参数
-
strength
- 以位为单位的安全强度,如果在getInstance
使用,getInstance
默认强度的-1。 -
capability
- 能力 -
personalizationString
- 个性化字符串作为字节数组,可以是null
。 将复制此字节数组的内容。 - 结果
-
一个新的
Instantiation
对象 - 异常
-
NullPointerException
- 如果capability
是null
-
IllegalArgumentException
- 如果strength
小于-1
-
nextBytes
public static DrbgParameters.NextBytes nextBytes(int strength, boolean predictionResistance, byte[] additionalInput)
- 参数
-
strength
- 请求的位安全强度。 如果设置为-1,将使用有效强度。 -
predictionResistance
- 要求预测阻力 -
additionalInput
- 附加输入,可以是null
。 将复制此字节数组的内容。 - 结果
-
一个新的
NextBytes
对象 - 异常
-
IllegalArgumentException
- 如果strength
小于-1
-
reseed
public static DrbgParameters.Reseed reseed(boolean predictionResistance, byte[] additionalInput)
- 参数
-
predictionResistance
- 要求预测阻力 -
additionalInput
- 附加输入,可以是null
。 将复制此字节数组的内容。 - 结果
-
一个新的
Reseed
对象
-
-