模块 java.base

类 SecureRandom

java.lang.Object
java.util.Random
java.security.SecureRandom
所有已实现的接口:
Serializable , RandomGenerator

public class SecureRandom extends Random
此类提供了一个密码学上强大的随机数生成器 (RNG)。

加密强随机数至少符合 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 可以随时通过调用 reseedsetSeed 方法重新播种。 reseed 方法从其熵源读取熵输入以重新播种。 setSeed 方法要求调用者提供种子。

请注意,并非所有 SecureRandom 实现都支持 reseed

某些 SecureRandom 实现可能会在其 nextBytes(byte[], SecureRandomParameters) reseed(SecureRandomParameters) 方法中接受一个 SecureRandomParameters 参数,以进一步控制这些方法的行为。

注意:根据实现,generateSeedreseednextBytes 方法可能会在收集熵时阻塞,例如,如果在各种类 Unix 操作系统上的熵源是 /dev/random。

线程安全

SecureRandom 对象可以安全地供多个并发线程使用。
实现要求:
SecureRandom 服务提供者可以通过在注册提供者时将 服务提供者属性“ThreadSafe”设置为“true”来宣传它是线程安全的。否则,此类将改为同步访问 SecureRandomSpi 实现的以下方法:
自从:
1.1
参见:
  • 构造方法详细信息

    • 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

      protected SecureRandom(SecureRandomSpi  secureRandomSpi, Provider  provider)
      创建一个 SecureRandom 对象.
      参数:
      secureRandomSpi - SecureRandom 实现。
      provider - 提供商。
  • 方法详情

    • getInstance

      public static SecureRandom  getInstance(String  algorithm) throws NoSuchAlgorithmException
      返回实现指定随机数生成器 (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 - 如果 algorithmnull
      自从:
      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 - 如果 algorithmnull
      自从:
      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 - 如果 algorithmnull
      自从:
      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 - 如果 algorithmnull
      自从:
      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 - 如果 algorithmnull
      自从:
      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 - 如果 algorithmnull
      自从:
      9
      参见:
    • getProvider

      public final Provider  getProvider()
      返回此 SecureRandom 对象的提供者。
      返回:
      SecureRandom 对象的提供者。
    • getAlgorithm

      public String  getAlgorithm()
      返回由此 SecureRandom 对象实现的算法的名称。
      返回:
      算法的名称或 unknown(如果无法确定算法名称)。
      自从:
      1.5
    • toString

      public String  toString()
      返回此 SecureRandom 的人类可读字符串表示形式。
      重写:
      toString 在类 Object
      返回:
      字符串表示
    • getParameters

      public SecureRandomParameters  getParameters()
      返回此 SecureRandom 实例的有效 SecureRandomParameters

      返回值可以不同于传递给 getInstance 方法的 SecureRandomParameters 对象,但在该 SecureRandom 对象的生命周期内不能更改。

      调用者可以使用返回值来找出此 SecureRandom 支持的功能。

      返回:
      有效的 SecureRandomParameters 参数,或者 null 如果没有使用参数。
      自从:
      9
      参见:
    • setSeed

      public void setSeed(byte[] seed)
      用给定的种子重新播种这个随机对象。种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会降低随机性。

      如果在任何 nextBytesreseed 调用之前调用 setSeed,则 PRNG SecureRandom 不会自动为自己播种。调用者应确保 seed 参数包含足够的熵以确保此 SecureRandom 的安全。

      参数:
      seed - 种子。
      参见:
    • setSeed

      public void setSeed(long seed)
      使用给定 long seed 中包含的八个字节重新播种此随机对象。给定的种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会降低随机性。

      定义此方法是为了与 java.util.Random 兼容。

      重写:
      setSeed 在类 Random
      参数:
      seed - 种子。
      参见:
    • nextBytes

      public void nextBytes(byte[] bytes)
      生成用户指定数量的随机字节。
      指定者:
      nextBytes 在接口 RandomGenerator
      重写:
      nextBytes 在类 Random
      参数:
      bytes - 要用随机字节填充的数组。
    • nextBytes

      public void nextBytes(byte[] bytes, SecureRandomParameters  params)
      使用附加参数生成用户指定数量的随机字节。
      参数:
      bytes - 要用随机字节填充的数组
      params - 附加参数
      抛出:
      NullPointerException - 如果 bytes 为空
      UnsupportedOperationException - 如果底层提供者实现没有覆盖此方法
      IllegalArgumentException - 如果 paramsnull ,则非法或不受此 SecureRandom 支持
      自从:
      9
    • next

      protected final int next(int numBits)
      生成一个整数,其中包含用户指定的伪随机位数量(右对齐,带前导零)。此方法重写 java.util.Random 方法,并用于为从该类继承的所有方法(例如 nextIntnextLongnextFloat )提供随机位源。
      重写:
      next 在类 Random
      参数:
      numBits - 要生成的伪随机位数,其中 0 <= numBits <= 32
      返回:
      int 包含用户指定数量的伪随机位(右对齐,前导零)。
    • getSeed

      public static byte[] getSeed(int numBytes)
      返回给定数量的种子字节,使用此类用于为自身播种的种子生成算法计算得出。此调用可用于为其他随机数生成器提供种子。

      包含此方法只是为了向后兼容。鼓励调用者使用备选的 getInstance 方法之一获取 SecureRandom 对象,然后调用 generateSeed 方法从该对象获取种子字节。

      参数:
      numBytes - 要生成的种子字节数。
      返回:
      种子字节。
      抛出:
      IllegalArgumentException - 如果 numBytes 为负
      参见:
    • 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 安全属性中包含已知强 SecureRandom 实现的列表。

      Java 平台的每个实现都需要支持至少一个强SecureRandom 实现。

      返回:
      securerandom.strongAlgorithms 安全属性指示的强 SecureRandom 实现
      抛出:
      NoSuchAlgorithmException - 如果没有可用的算法
      自从:
      1.8
      参见:
    • reseed

      public void reseed()
      使用从其熵源读取的熵输入重新播种此 SecureRandom
      抛出:
      UnsupportedOperationException - 如果底层提供者实现没有覆盖此方法。
      自从:
      9
    • reseed

      public void reseed(SecureRandomParameters  params)
      使用附加参数从其熵源读取的熵输入重新播种此 SecureRandom

      请注意,熵是从熵源获得的。虽然 params 中的一些数据可能包含熵,但它的主要用途是提供多样性。

      参数:
      params - 额外参数
      抛出:
      UnsupportedOperationException - 如果底层提供者实现没有覆盖此方法。
      IllegalArgumentException - 如果 paramsnull ,则非法或不受此 SecureRandom 支持
      自从:
      9