- 所有已实现的接口:
Serializable
,RandomGenerator
加密强随机数至少符合 FIPS 140-2,加密模块的安全要求 第 4.9.1 节中指定的统计随机数生成器测试。此外,SecureRandom
必须产生不确定的输出。因此,传递给 SecureRandom
对象的任何种子材料都必须是不可预测的,并且所有 SecureRandom
输出序列必须具有强加密性,如 RFC 4086:安全的随机性要求 中所述。
许多 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
,则不会发生这种自播种。
SecureRandom
可以随时通过调用 reseed
或 setSeed
方法重新播种。 reseed
方法从其熵源读取熵输入以重新播种。 setSeed
方法要求调用者提供种子。
请注意,并非所有 SecureRandom
实现都支持 reseed
。
某些 SecureRandom
实现可能会在其 nextBytes(byte[], SecureRandomParameters)
和 reseed(SecureRandomParameters)
方法中接受一个 SecureRandomParameters
参数,以进一步控制这些方法的行为。
注意:根据实现,generateSeed
、reseed
和 nextBytes
方法可能会在收集熵时阻塞,例如,如果在各种类 Unix 操作系统上的熵源是 /dev/random。
线程安全
SecureRandom
对象可以安全地供多个并发线程使用。
- 实现要求:
SecureRandom
服务提供者可以通过在注册提供者时将 服务提供者属性“ThreadSafe”设置为“true”来宣传它是线程安全的。否则,此类将改为同步访问SecureRandomSpi
实现的以下方法:- 自从:
- 1.1
- 参见:
-
内部类总结
-
构造方法总结
修饰符构造方法描述构造一个实现默认随机数算法的安全随机数生成器 (RNG)。SecureRandom
(byte[] seed) 构造一个实现默认随机数算法的安全随机数生成器 (RNG)。protected
SecureRandom
(SecureRandomSpi secureRandomSpi, Provider provider) 创建一个SecureRandom
对象. -
方法总结
修饰符和类型方法描述byte[]
generateSeed
(int numBytes) 返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。返回由此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) 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。static SecureRandom
getInstance
(String algorithm, SecureRandomParameters params, String provider) 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。static SecureRandom
getInstance
(String algorithm, SecureRandomParameters params, Provider provider) 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。static SecureRandom
返回此SecureRandom
实例的有效SecureRandomParameters
。final Provider
返回此SecureRandom
对象的提供者。static byte[]
getSeed
(int numBytes) 返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。protected final 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
中包含的八个字节重新播种此随机对象。toString()
返回此SecureRandom
的人类可读字符串表示形式。在类 java.util.Random 中声明的方法
doubles, doubles, doubles, doubles, ints, ints, ints, ints, longs, longs, longs, longs, nextBoolean, nextDouble, nextFloat, nextGaussian, nextInt, nextInt, nextLong
在类 java.lang.Object 中声明的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
在接口 java.util.random.RandomGenerator 中声明的方法
isDeprecated, nextDouble, nextDouble, nextExponential, nextFloat, nextFloat, nextGaussian, nextInt, nextLong, nextLong
-
构造方法详细信息
-
SecureRandom
public SecureRandom()构造一个实现默认随机数算法的安全随机数生成器 (RNG)。此构造函数从最首选的提供程序开始遍历已注册的安全提供程序的列表。返回一个新的
SecureRandom
对象,该对象封装来自第一个支持SecureRandom
(RNG) 算法的 Provider 的SecureRandomSpi
实现。如果没有一个提供者支持 RNG 算法,则返回特定于实现的默认值。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的
SecureRandom
部分。 -
SecureRandom
public SecureRandom(byte[] seed) 构造一个实现默认随机数算法的安全随机数生成器 (RNG)。SecureRandom
实例使用指定的种子字节作为种子。此构造函数从最首选的提供程序开始遍历已注册的安全提供程序的列表。返回一个新的
SecureRandom
对象,该对象封装来自第一个支持SecureRandom
(RNG) 算法的 Provider 的SecureRandomSpi
实现。如果没有一个提供者支持 RNG 算法,则返回特定于实现的默认值。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的
SecureRandom
部分。- 参数:
seed
- 种子。
-
SecureRandom
创建一个SecureRandom
对象.- 参数:
secureRandomSpi
-SecureRandom
实现。provider
- 提供商。
-
-
方法详情
-
getInstance
返回实现指定随机数生成器 (RNG) 算法的SecureRandom
对象。此方法从最首选的提供程序开始遍历已注册的安全提供程序的列表。返回一个新的
SecureRandom
对象,该对象封装来自支持指定算法的第一个 Provider 的SecureRandomSpi
实现。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- 实现注意事项:
-
JDK 参考实现还使用
jdk.security.provider.preferred
Security
属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()
返回的提供商顺序不同。 - 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。- 返回:
-
新的
SecureRandom
对象 - 抛出:
NoSuchAlgorithmException
- 如果没有Provider
支持指定算法的SecureRandomSpi
实现NullPointerException
- 如果algorithm
是null
- 自从:
- 1.2
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, String provider) throws NoSuchAlgorithmException , NoSuchProviderException 返回实现指定随机数生成器 (RNG) 算法的SecureRandom
对象。返回一个新的
SecureRandom
对象,它封装了来自指定提供者的SecureRandomSpi
实现。指定的提供者必须在安全提供者列表中注册。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。provider
- 提供商的名称。- 返回:
-
新的
SecureRandom
对象 - 抛出:
IllegalArgumentException
- 如果提供商名称为null
或为空NoSuchAlgorithmException
- 如果指定算法的SecureRandomSpi
实现无法从指定提供者处获得NoSuchProviderException
- 如果指定的提供者没有在安全提供者列表中注册NullPointerException
- 如果algorithm
是null
- 自从:
- 1.2
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException 返回实现指定随机数生成器 (RNG) 算法的SecureRandom
对象。返回一个新的
SecureRandom
对象,该对象封装了指定Provider
对象中的SecureRandomSpi
实现。请注意,指定的Provider
对象不必在提供程序列表中注册。- 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。provider
- 提供商。- 返回:
-
新的
SecureRandom
对象 - 抛出:
IllegalArgumentException
- 如果指定的提供者是null
NoSuchAlgorithmException
- 如果无法从指定的Provider
对象获得指定算法的SecureRandomSpi
实现NullPointerException
- 如果algorithm
是null
- 自从:
- 1.4
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params) throws NoSuchAlgorithmException 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。此方法从最首选的提供程序开始遍历已注册的安全提供程序的列表。返回一个新的
SecureRandom
对象,该对象封装来自支持指定算法和指定SecureRandomParameters
的第一个 Provider 的SecureRandomSpi
实现。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- 实现注意事项:
-
JDK 参考实现还使用
jdk.security.provider.preferred
属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()
返回的提供者的顺序不同。 - 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。params
-SecureRandomParameters
新创建的SecureRandom
对象必须支持。- 返回:
-
新的
SecureRandom
对象 - 抛出:
IllegalArgumentException
- 如果指定的参数是null
NoSuchAlgorithmException
- 如果没有 Provider 支持指定算法和参数的SecureRandomSpi
实现NullPointerException
- 如果algorithm
是null
- 自从:
- 9
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, String provider) throws NoSuchAlgorithmException , NoSuchProviderException 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。返回一个新的
SecureRandom
对象,它封装了来自指定提供者的SecureRandomSpi
实现。指定的提供者必须在安全提供者列表中注册。请注意,可以通过
Security.getProviders()
方法检索已注册提供商的列表。- 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。params
-SecureRandomParameters
新创建的SecureRandom
对象必须支持。provider
- 提供商的名称。- 返回:
-
新的
SecureRandom
对象 - 抛出:
IllegalArgumentException
- 如果提供者名称为null
或为空,或者参数为null
NoSuchAlgorithmException
- 如果指定的提供者不支持指定算法和参数的SecureRandomSpi
实现NoSuchProviderException
- 如果指定的提供者没有在安全提供者列表中注册NullPointerException
- 如果algorithm
是null
- 自从:
- 9
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, Provider provider) throws NoSuchAlgorithmException 返回一个SecureRandom
对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters
请求。返回一个新的
SecureRandom
对象,该对象封装了指定Provider
对象中的SecureRandomSpi
实现。请注意,指定的Provider
对象不必在提供程序列表中注册。- 参数:
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom
部分。params
-SecureRandomParameters
新创建的SecureRandom
对象必须支持。provider
- 提供商。- 返回:
-
新的
SecureRandom
对象 - 抛出:
IllegalArgumentException
- 如果指定的提供者或参数是null
NoSuchAlgorithmException
- 如果指定的提供者不支持指定算法和参数的SecureRandomSpi
实现NullPointerException
- 如果algorithm
是null
- 自从:
- 9
- 参见:
-
getProvider
返回此SecureRandom
对象的提供者。- 返回:
-
此
SecureRandom
对象的提供者。
-
getAlgorithm
返回由此SecureRandom
对象实现的算法的名称。- 返回:
-
算法的名称或
unknown
(如果无法确定算法名称)。 - 自从:
- 1.5
-
toString
返回此SecureRandom
的人类可读字符串表示形式。 -
getParameters
返回此SecureRandom
实例的有效SecureRandomParameters
。返回值可以不同于传递给
getInstance
方法的SecureRandomParameters
对象,但在该SecureRandom
对象的生命周期内不能更改。调用者可以使用返回值来找出此
SecureRandom
支持的功能。- 返回:
-
有效的
SecureRandomParameters
参数,或者null
如果没有使用参数。 - 自从:
- 9
- 参见:
-
setSeed
public void setSeed(byte[] seed) 用给定的种子重新播种这个随机对象。种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会降低随机性。如果在任何
nextBytes
或reseed
调用之前调用setSeed
,则 PRNGSecureRandom
不会自动为自己播种。调用者应确保seed
参数包含足够的熵以确保此SecureRandom
的安全。- 参数:
seed
- 种子。- 参见:
-
setSeed
public void setSeed(long seed) 使用给定long seed
中包含的八个字节重新播种此随机对象。给定的种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会降低随机性。定义此方法是为了与
java.util.Random
兼容。 -
nextBytes
public void nextBytes(byte[] bytes) 生成用户指定数量的随机字节。- 指定者:
nextBytes
在接口RandomGenerator
中- 重写:
nextBytes
在类Random
中- 参数:
bytes
- 要用随机字节填充的数组。
-
nextBytes
使用附加参数生成用户指定数量的随机字节。- 参数:
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
为负- 参见:
-
generateSeed
public byte[] generateSeed(int numBytes) 返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。此调用可用于为其他随机数生成器提供种子。- 参数:
numBytes
- 要生成的种子字节数。- 返回:
- 种子字节。
- 抛出:
IllegalArgumentException
- 如果numBytes
为负
-
getInstanceStrong
返回使用securerandom.strongAlgorithms
Security
属性中指定的算法/提供程序选择的SecureRandom
对象。某些情况需要强随机值,例如在创建高值/长寿命的秘密时,如 RSA 公钥/私钥。为了帮助指导应用程序选择合适的强
SecureRandom
实现,Java 发行版在securerandom.strongAlgorithms
安全属性中包含已知强SecureRandom
实现的列表。Java 平台的每个实现都需要支持至少一个强
SecureRandom
实现。- 返回:
securerandom.strongAlgorithms
安全属性指示的强SecureRandom
实现- 抛出:
NoSuchAlgorithmException
- 如果没有可用的算法- 自从:
- 1.8
- 参见:
-
reseed
public void reseed()使用从其熵源读取的熵输入重新播种此SecureRandom
。- 抛出:
UnsupportedOperationException
- 如果底层提供者实现没有覆盖此方法。- 自从:
- 9
-
reseed
使用附加参数从其熵源读取的熵输入重新播种此SecureRandom
。请注意,熵是从熵源获得的。虽然
params
中的一些数据可能包含熵,但它的主要用途是提供多样性。- 参数:
params
- 额外参数- 抛出:
UnsupportedOperationException
- 如果底层提供者实现没有覆盖此方法。IllegalArgumentException
- 如果params
是null
,则非法或不受此SecureRandom
支持- 自从:
- 9
-