- 所有已实现的接口:
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)。protectedSecureRandom(SecureRandomSpi secureRandomSpi, Provider provider) 创建一个SecureRandom对象. -
方法总结
修饰符和类型方法描述byte[]generateSeed(int numBytes) 返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。返回由此SecureRandom对象实现的算法的名称。static SecureRandomgetInstance(String algorithm) 返回实现指定随机数生成器 (RNG) 算法的SecureRandom对象。static SecureRandomgetInstance(String algorithm, String provider) 返回实现指定随机数生成器 (RNG) 算法的SecureRandom对象。static SecureRandomgetInstance(String algorithm, Provider provider) 返回实现指定随机数生成器 (RNG) 算法的SecureRandom对象。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params) 返回一个SecureRandom对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters请求。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params, String provider) 返回一个SecureRandom对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters请求。static SecureRandomgetInstance(String algorithm, SecureRandomParameters params, Provider provider) 返回一个SecureRandom对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters请求。static SecureRandom返回此SecureRandom实例的有效SecureRandomParameters。final Provider返回此SecureRandom对象的提供者。static byte[]getSeed(int numBytes) 返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。protected final intnext(int numBits) 生成一个包含用户指定数量的伪随机位的整数(右对齐,前导零)。voidnextBytes(byte[] bytes) 生成用户指定数量的随机字节。voidnextBytes(byte[] bytes, SecureRandomParameters params) 使用附加参数生成用户指定数量的随机字节。voidreseed()使用从其熵源读取的熵输入重新播种此SecureRandom。voidreseed(SecureRandomParameters params) 使用附加参数从其熵源读取的熵输入重新播种此SecureRandom。voidsetSeed(byte[] seed) 用给定的种子重新播种这个随机对象。voidsetSeed(long seed) 使用给定long seed中包含的八个字节重新播种此随机对象。toString()返回此SecureRandom的人类可读字符串表示形式。在类 java.util.Random 中声明的方法
doubles, doubles, doubles, doubles, from, 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) 算法的第一个提供者的SecureRandomSpi实现。如果没有提供者支持 RNG 算法,则返回特定于实现的默认值。请注意,可以通过
Security.getProviders()方法检索已注册提供商的列表。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的
SecureRandom部分。 -
SecureRandom
public SecureRandom(byte[] seed) 构造一个实现默认随机数算法的安全随机数生成器 (RNG)。SecureRandom实例使用指定的种子字节作为种子。此构造函数遍历已注册的安全提供者列表,从最首选的提供者开始。一个新的
SecureRandom对象封装了来自支持SecureRandom(RNG) 算法的第一个提供者的SecureRandomSpi实现。如果没有提供者支持 RNG 算法,则返回特定于实现的默认值。请注意,可以通过
Security.getProviders()方法检索已注册提供商的列表。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的
SecureRandom部分。- 参数:
seed- 种子。
-
SecureRandom
创建一个SecureRandom对象.- 参数:
secureRandomSpi-SecureRandom实现。provider- 提供商。
-
-
方法详情
-
getInstance
返回实现指定随机数生成器 (RNG) 算法的SecureRandom对象。此方法遍历已注册的安全提供者列表,从最喜欢的提供者开始。返回一个新的
SecureRandom对象,该对象封装了支持指定算法的第一个提供者的SecureRandomSpi实现。请注意,可以通过
Security.getProviders()方法检索已注册提供商的列表。- 实现注意事项:
-
JDK 参考实现还使用
jdk.security.provider.preferredSecurity属性来确定指定算法的首选提供程序顺序。这可能与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对象,它封装了来自指定提供者的SecureRandomSpi实现。请注意,指定的提供者不必在提供者列表中注册。- 参数:
algorithm- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom部分。provider- 提供商。- 返回:
-
新的
SecureRandom对象 - 抛出:
IllegalArgumentException- 如果指定的提供者是nullNoSuchAlgorithmException- 如果无法从指定的Provider对象获得指定算法的SecureRandomSpi实现NullPointerException- 如果algorithm是null- 自从:
- 1.4
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params) throws NoSuchAlgorithmException 返回一个SecureRandom对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters请求。此方法遍历已注册安全提供程序的列表,从最首选的提供程序开始。一个新的
SecureRandom对象封装了来自第一个支持指定算法和指定SecureRandomParameters的提供者的SecureRandomSpi实现。请注意,可以通过
Security.getProviders()方法检索已注册提供商的列表。- 实现注意事项:
-
JDK 参考实现还使用
jdk.security.provider.preferred属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供商顺序不同。 - 参数:
algorithm- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom部分。params-SecureRandomParameters新创建的SecureRandom对象必须支持。- 返回:
-
新的
SecureRandom对象 - 抛出:
IllegalArgumentException- 如果指定的参数是nullNoSuchAlgorithmException- 如果没有 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或为空,或者参数为nullNoSuchAlgorithmException- 如果指定的提供者不支持指定算法和参数的SecureRandomSpi实现NoSuchProviderException- 如果指定的提供者没有在安全提供者列表中注册NullPointerException- 如果algorithm是null- 自从:
- 9
- 参见:
-
getInstance
public static SecureRandom getInstance(String algorithm, SecureRandomParameters params, Provider provider) throws NoSuchAlgorithmException 返回一个SecureRandom对象,该对象实现指定的随机数生成器 (RNG) 算法并支持指定的SecureRandomParameters请求。返回一个新的
SecureRandom对象,它封装了来自指定提供者的SecureRandomSpi实现。请注意,指定的提供者不必在提供者列表中注册。- 参数:
algorithm- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅 Java 安全标准算法名称规范 中的SecureRandom部分。params-SecureRandomParameters新创建的SecureRandom对象必须支持。provider- 提供商。- 返回:
-
新的
SecureRandom对象 - 抛出:
IllegalArgumentException- 如果指定的提供者或参数是nullNoSuchAlgorithmException- 如果指定的提供者不支持指定算法和参数的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中包含的八个字节重新播种此随机对象。给定的种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会降低随机性。如果在任何
nextBytes或reseed调用之前调用setSeed,则 PRNGSecureRandom不会自动为自己播种。调用者应确保seed参数包含足够的熵以确保此SecureRandom的安全。定义此方法是为了与
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.strongAlgorithmsSecurity属性中指定的算法/提供程序选择的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
-