- java.lang.Object
-
- java.util.Random
-
- java.security.SecureRandom
-
- All Implemented Interfaces:
-
Serializable
public class SecureRandom extends Random
这个类提供了一个密码强的随机数生成器(RNG)。密码强的随机数最低限度符合FIPS 140-2, Security Requirements for Cryptographic Modules第4.9.1节中规定的统计随机数发生器测试。 此外,
SecureRandom
必须产生非确定性输出。 因此,传递给SecureRandom
对象的任何种子材料必须是不可预测的,并且所有SecureRandom
输出序列必须加密强度,如RFC 4086: Randomness Requirements for Security中所述 。许多
SecureRandom
实现是伪随机数生成器(PRNG,也称为确定性随机位生成器或DRBG)的形式,这意味着它们使用确定性算法从随机种子产生伪随机序列。 其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合。调用者通过无参数构造函数或
getInstance
方法之一获取SecureRandom
实例。 例如:SecureRandom r1 = new SecureRandom(); SecureRandom r2 = SecureRandom.getInstance("NativePRNG"); SecureRandom r3 = SecureRandom.getInstance("DRBG", DrbgParameters.instantiation(128, RESEED_ONLY, null));
上述第三个语句返回支持特定实例参数的特定算法的一个
SecureRandom
对象。 实现的有效实例参数必须与此最小请求匹配,但不一定相同。 例如,即使请求不需要某个功能,实际的实例化也可以提供该功能。 实现可能会延迟实例化一个SecureRandom
直到它被实际使用,但有效的实例参数必须在创建之后立即确定,并且getParameters()
应始终返回相同的结果。典型的呼叫者
SecureRandom
调用以下方法来检索随机字节:SecureRandom random = new SecureRandom(); byte[] bytes = new byte[20]; random.nextBytes(bytes);
呼叫者还可以调用
generateSeed(int)
方法来生成给定数量的种子字节(例如,种子其他随机数生成器):byte[] seed = random.generateSeed(20);
新创建的PRNG
SecureRandom
对象未被种子(除非由SecureRandom(byte[])
创建)。 第一个呼叫nextBytes
将迫使它从一个实现特定的熵源进行种子化。 如果以前打过setSeed
,这种自播不会发生。A
SecureRandom
可以随时通过调用reseed
或setSeed
方法重新进入。reseed
方法从熵源读取熵输入以重新设定自身。setSeed
方法要求调用者提供种子。请注意:
reseed
可能不是所有支持SecureRandom
实现。一些
SecureRandom
实现可以在其nextBytes(byte[], SecureRandomParameters)
和reseed(SecureRandomParameters)
方法中接受SecureRandomParameters
参数,以进一步控制方法的行为。注意:根据实施,
generateSeed
,reseed
和nextBytes
方法可阻止作为熵被收集,例如,如果源熵是/ dev /上的各种类Unix操作系统随机的。线程安全
SecureRandom
对象可以安全地被多个并发线程使用。- 实现要求:
-
A
SecureRandom
服务提供商可以通过在注册提供程序时将service provider attribute “ThreadSafe”设置为“true”来宣传其是线程安全的。 否则,此类将同步访问SecureRandomSpi
实现的以下方法: - 从以下版本开始:
- 1.1
- 另请参见:
-
SecureRandomSpi
,Random
, Serialized Form
-
-
构造方法摘要
构造方法 Modifier Constructor 描述 SecureRandom()
构造一个实现默认随机数算法的安全随机数生成器(RNG)。SecureRandom(byte[] seed)
构造一个实现默认随机数算法的安全随机数生成器(RNG)。protected
SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
创建一个SecureRandom
对象。
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 byte[]
generateSeed(int numBytes)
返回给定数量的种子字节,使用该类用于种子本身的种子生成算法计算。String
getAlgorithm()
返回由该SecureRandom
对象实现的算法的名称。static SecureRandom
getInstance(String algorithm)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。static SecureRandom
getInstance(String algorithm, String provider)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。static SecureRandom
getInstance(String algorithm, Provider provider)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。static SecureRandom
getInstance(String algorithm, SecureRandomParameters params)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。static SecureRandom
getInstance(String algorithm, SecureRandomParameters params, String provider)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。static SecureRandom
getInstance(String algorithm, SecureRandomParameters params, Provider provider)
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。static SecureRandom
getInstanceStrong()
返回通过使用securerandom.strongAlgorithms
Security
属性中指定的算法/提供程序选择的SecureRandom
对象。SecureRandomParameters
getParameters()
返回此SecureRandom
实例的有效SecureRandomParameters
。Provider
getProvider()
返回此SecureRandom
对象的提供者。static byte[]
getSeed(int numBytes)
返回给定数量的种子字节,使用该类用于种子本身的种子生成算法计算。protected int
next(int numBits)
生成一个包含用户指定数量的伪随机位的整数(右对齐,带前导零)。void
nextBytes(byte[] bytes)
生成用户指定的随机字节数。void
nextBytes(byte[] bytes, SecureRandomParameters params)
使用附加参数生成用户指定的随机字节数。void
reseed()
使用从其熵源读取的熵输入来确定此SecureRandom
。void
reseed(SecureRandomParameters params)
用这个SecureRandom
的熵输入从其熵源读取附加参数。void
setSeed(byte[] seed)
用给定的种子重新设定这个随机对象。void
setSeed(long seed)
使用给定的long seed
包含的八个字节重新设置此随机对象。String
toString()
返回此SecureRandom
的人类可读字符串表示SecureRandom
。
-
-
-
构造方法详细信息
-
SecureRandom
public SecureRandom()
构造一个实现默认随机数算法的安全随机数生成器(RNG)。此构造函数遍历注册的安全提供程序列表,从最优选的提供程序开始。
SecureRandomSpi
从支持SecureRandom
(RNG)算法的第一个提供程序封装SecureRandomSpi
实现的新的SecureRandom
对象。 如果没有提供者支持RNG算法,则返回实现特定的默认值。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。见
SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。
-
SecureRandom
public SecureRandom(byte[] seed)
构造一个实现默认随机数算法的安全随机数生成器(RNG)。SecureRandom
实例用指定的种子字节种子。此构造函数遍历注册的安全提供程序列表,从最优选的提供程序开始。
SecureRandomSpi
从支持SecureRandom
(RNG)算法的第一个提供程序封装SecureRandomSpi
实现的新的SecureRandom
对象。 如果没有提供者支持RNG算法,则返回实现特定的默认值。请注意,可以通过
Security.getProviders()
方法检索注册提供商的列表。见
SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。- 参数
-
seed
- 种子。
-
SecureRandom
protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
创建一个SecureRandom
对象。- 参数
-
secureRandomSpi
-SecureRandom
实现。 -
provider
- 提供商。
-
-
方法详细信息
-
getInstance
public static SecureRandom getInstance(String algorithm) throws NoSuchAlgorithmException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。此方法遍历已注册的安全提供程序列表,从最优选的提供程序开始。
SecureRandomSpi
从支持指定算法的第一个提供者封装SecureRandomSpi
实现的新的SecureRandom
对象。请注意,注册提供商的列表可以通过
Security.getProviders()
方法检索。- Implementation Note:
-
JDK参考实现另外使用
jdk.security.provider.preferred
Security
属性来确定指定算法的首选提供者顺序。 这可能与Security.getProviders()
返回的提供商的顺序不同。 - 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 - 结果
-
新的
SecureRandom
对象 - 异常
-
NoSuchAlgorithmException
- 如果没有Provider
支持指定算法的SecureRandomSpi
实现 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 1.2
- 另请参见:
-
Provider
-
getInstance
public static SecureRandom getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。返回从指定的提供程序封装
SecureRandomSpi
实现的新的SecureRandom
对象。 指定的提供者必须在安全提供程序列表中注册。请注意,可以通过
Security.getProviders()
方法检索注册提供商的列表。- 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 -
provider
- 提供商的名称。 - 结果
-
新的
SecureRandom
对象 - 异常
-
IllegalArgumentException
- 如果提供商名称为null
或为空 -
NoSuchAlgorithmException
- 如果指定算法的SecureRandomSpi
实现不能从指定的提供者获得 -
NoSuchProviderException
- 如果指定的提供程序未在安全提供程序列表中注册 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 1.2
- 另请参见:
-
Provider
-
getInstance
public static SecureRandom getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象。新
SecureRandom
对象封装SecureRandomSpi
从指定执行Provider
返回对象。 请注意,指定的Provider
对象不必在提供者列表中注册。- 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 -
provider
- 提供商。 - 结果
-
新的
SecureRandom
对象 - 异常
-
IllegalArgumentException
- 如果指定的提供者是null
-
NoSuchAlgorithmException
- 如果指定的算法的SecureRandomSpi
实现不能从指定的Provider
对象获得 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 1.4
- 另请参见:
-
Provider
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params) throws NoSuchAlgorithmException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。此方法遍历已注册的安全提供程序列表,从最优选的提供程序开始。 返回一个新的
SecureRandom
对象,该对象封装了来自第一个提供程序的SecureRandomSpi
实现,该提供程序支持指定的算法和指定的SecureRandomParameters
。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- Implementation Note:
-
JDK参考实现另外使用
jdk.security.provider.preferred
属性来确定指定算法的首选提供者顺序。 这可能与Security.getProviders()
返回的提供商的顺序不同。 - 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 -
params
-在SecureRandomParameters
新创建SecureRandom
对象必须支持。 - 结果
-
新的
SecureRandom
对象 - 异常
-
IllegalArgumentException
- 如果指定的参数是null
-
NoSuchAlgorithmException
- 如果没有提供程序支持指定算法和参数的SecureRandomSpi
实现 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 9
- 另请参见:
-
Provider
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。返回从指定提供程序封装
SecureRandomSpi
实现的新的SecureRandom
对象。 指定的提供者必须在安全提供程序列表中注册。请注意,注册提供商的列表可以通过
Security.getProviders()
方法检索。- 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 -
params
-SecureRandomParameters
新建SecureRandom
对象必须支持。 -
provider
- 提供商的名称。 - 结果
-
新的
SecureRandom
对象 - 异常
-
IllegalArgumentException
- 如果提供商名称为null
或为空,或params为null
-
NoSuchAlgorithmException
- 如果指定的提供程序不支持针对指定算法和参数的SecureRandomSpi
实现 -
NoSuchProviderException
- 如果指定的提供程序未在安全提供程序列表中注册 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 9
- 另请参见:
-
Provider
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, Provider provider) throws NoSuchAlgorithmException
返回实现指定的随机数生成器(RNG)算法的SecureRandom
对象,并支持指定的SecureRandomParameters
请求。新
SecureRandom
对象封装SecureRandomSpi
从指定执行Provider
返回对象。 请注意,指定的Provider
对象不必在提供者列表中注册。- 参数
-
algorithm
- RNG算法的名称。 见SecureRandom
的部分Java Security Standard Algorithm Names Specification有关标准RNG算法名称的信息。 -
params
-在SecureRandomParameters
新创建SecureRandom
对象必须支持。 -
provider
- 提供商。 - 结果
-
新的
SecureRandom
对象 - 异常
-
IllegalArgumentException
- 如果指定的提供者或参数是null
-
NoSuchAlgorithmException
- 如果指定的提供程序不支持针对指定算法和参数的SecureRandomSpi
实现 -
NullPointerException
- 如果algorithm
是null
- 从以下版本开始:
- 9
- 另请参见:
-
Provider
-
getProvider
public final Provider getProvider()
返回此SecureRandom
对象的提供者。- 结果
-
这个
SecureRandom
对象的提供者。
-
getAlgorithm
public String getAlgorithm()
返回由该SecureRandom
对象实现的算法的名称。- 结果
-
如果算法名称无法确定,则算法的名称为
unknown
。 - 从以下版本开始:
- 1.5
-
toString
public String toString()
返回此SecureRandom
的人类可读字符串表示SecureRandom
。
-
getParameters
public SecureRandomParameters getParameters()
返回此SecureRandom
实例的有效SecureRandomParameters
。返回的值可能与传递给
getInstance
方法的SecureRandomParameters
对象不同,但在此SecureRandom
对象的生命周期内不能更改。一个调用者可以使用返回的值来找出这个
SecureRandom
支持哪些特性。- 结果
-
有效的
SecureRandomParameters
参数,如果没有使用参数,null
。 - 从以下版本开始:
- 9
- 另请参见:
-
SecureRandomSpi
-
setSeed
public void setSeed(byte[] seed)
用给定的种子重新设定这个随机对象。 种子补充,而不是替代现有的种子。 因此,重复的呼叫保证不会减少随机性。一个PRNG
SecureRandom
如果不会自动种子本身setSeed
之前任何所谓nextBytes
或者reseed
电话。 调用者应该确保seed
参数包含足够的熵来确保这个SecureRandom
的安全性。- 参数
-
seed
- 种子。 - 另请参见:
-
getSeed(int)
-
setSeed
public void setSeed(long seed)
使用给定的long seed
包含的八个字节重新设置此随机对象。 给定的种子补充,而不是替代现有的种子。 因此,重复的呼叫保证不会减少随机性。此方法的定义是与
java.util.Random
兼容性。- 重写:
-
setSeed
在Random
- 参数
-
seed
- 种子。 - 另请参见:
-
getSeed(int)
-
nextBytes
public void nextBytes(byte[] bytes)
生成用户指定的随机字节数。
-
nextBytes
public void nextBytes(byte[] bytes, SecureRandomParameters params)
使用附加参数生成用户指定的随机字节数。- 参数
-
bytes
- 要用随机字节填充的数组 -
params
- 附加参数 - 异常
-
NullPointerException
- 如果bytes
为空 -
UnsupportedOperationException
- 如果底层提供者实现没有覆盖此方法 -
IllegalArgumentException
- 如果params
是null
,非法或不支持此SecureRandom
- 从以下版本开始:
- 9
-
next
protected final int next(int numBits)
生成一个包含用户指定数量的伪随机位的整数(右对齐,带前导零)。 此方法重写一个java.util.Random
方法,以及用于提供随机比特的源到所有的从类继承的方法(例如,nextInt
,nextLong
,和nextFloat
)。
-
getSeed
public static byte[] getSeed(int numBytes)
返回给定数量的种子字节,使用该类用于种子本身的种子生成算法计算。 该呼叫可以用于种子其他随机数发生器。此方法仅用于向后兼容。 鼓励呼叫者使用另一种
getInstance
方法来获取一个SecureRandom
对象,然后调用generateSeed
方法从该对象获取种子字节。- 参数
-
numBytes
- 要生成的种子字节数。 - 结果
- 种子字节。
- 异常
-
IllegalArgumentException
- 如果numBytes
为负数 - 另请参见:
-
setSeed(byte[])
-
generateSeed
public byte[] generateSeed(int numBytes)
返回给定数量的种子字节,使用该类用于种子本身的种子生成算法计算。 该呼叫可以用于种子其他随机数发生器。- 参数
-
numBytes
- 要生成的种子字节数。 - 结果
- 种子字节。
- 异常
-
IllegalArgumentException
- 如果numBytes
为负数
-
getInstanceStrong
public static SecureRandom getInstanceStrong() throws NoSuchAlgorithmException
返回通过使用securerandom.strongAlgorithms
Security
属性中指定的算法/提供程序选择的一个SecureRandom
对象。某些情况需要强大的随机值,例如创建高价值/长寿命秘密(如RSA公钥/私钥)时。 为了帮助指导应用程序选择合适的强大的
SecureRandom
实现,Java发行版包括securerandom.strongAlgorithms
Security属性中已知的强大的SecureRandom
实现列表。Java平台的每个实现都需要至少支持一个强大的
SecureRandom
实现。- 结果
-
一个强大的
SecureRandom
实施,如securerandom.strongAlgorithms
Security Properties所示 - 异常
-
NoSuchAlgorithmException
- 如果没有算法可用 - 从以下版本开始:
- 1.8
- 另请参见:
-
Security.getProperty(String)
-
reseed
public void reseed()
使用从其熵源读取的熵输入来确定此SecureRandom
。- 异常
-
UnsupportedOperationException
- 如果底层提供者实现没有覆盖此方法。 - 从以下版本开始:
- 9
-
reseed
public void reseed(SecureRandomParameters params)
重新设计这个SecureRandom
其中熵输入从其熵源读取附加参数。注意,熵是从熵源获得的。 虽然
params
一些数据可能包含熵,但其主要用途是提供多样性。- 参数
-
params
- 额外的参数 - 异常
-
UnsupportedOperationException
- 如果底层提供者实现没有覆盖此方法。 -
IllegalArgumentException
- 如果params
是null
,非法或不支持此SecureRandom
- 从以下版本开始:
- 9
-
-