- 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
对象和其他信息(例如,不由此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()
有其capability为NONE
,它必须实现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.NextBytes
和DrbgParameters.Reseed
类支持额外的输入。如果DRBG未被明确地用
DrbgParameters.Instantiation
对象实例化,则该实现将以128位的默认请求强度,无预测阻力请求,无个性化字符串实例化。 这些默认实例化参数也可以使用securerandom.drbg.config
安全属性进行自定义。该实现从由安全属性
securerandom.source
确定的系统默认熵源读取新鲜熵。调用
SecureRandom.generateSeed(int)
将直接从该系统读取默认熵源。此实施已通过20151104版本的The DRBG Test Vectors中包含的所有测试。
- 从以下版本开始:
- 9
-
-
Nested Class Summary
Nested Classes Modifier and Type Class 描述 static class
DrbgParameters.Capability
DRBG的可重新预测和预测抵抗能力。static class
DrbgParameters.Instantiation
用于实例化的DRBG参数。static class
DrbgParameters.NextBytes
用于随机位生成的DRBG参数。static class
DrbgParameters.Reseed
重新植入的DRBG参数。
-
方法摘要
所有方法 静态方法 具体的方法 Modifier and Type 方法 描述 static DrbgParameters.Instantiation
instantiation(int strength, DrbgParameters.Capability capability, byte[] personalizationString)
生成一个DrbgParameters.Instantiation
对象。static DrbgParameters.NextBytes
nextBytes(int strength, boolean predictionResistance, byte[] additionalInput)
生成一个DrbgParameters.NextBytes
对象。static DrbgParameters.Reseed
reseed(boolean predictionResistance, byte[] additionalInput)
生成一个DrbgParameters.Reseed
对象。
-
-
-
方法详细信息
-
instantiation
public static DrbgParameters.Instantiation instantiation(int strength, DrbgParameters.Capability capability, byte[] personalizationString)
生成一个DrbgParameters.Instantiation
对象。- 参数
-
strength
- 安全强度(以位为单位),-1表示默认强度,如果在getInstance
。 -
capability
- 能力 -
personalizationString
- 个性化字符串作为字节数组,可以是null
。 该字节数组的内容将被复制。 - 结果
-
一个新的
Instantiation
对象 - 异常
-
NullPointerException
- 如果capability
是null
-
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
对象
-
-