JavaTM 2 Platform
Standard Ed. 5.0

java.security
类 SecureRandom

java.lang.Object
  继承者 java.util.Random
      继承者 java.security.SecureRandom
所有已实现的接口:
Serializable

public class SecureRandom
extends Random

此类提供加密的强随机数生成器 (RNG)。许多实现都是伪随机数生成器 (PRNG) 形式,这意味着它们将使用确定的算法根据实际的随机种子生成伪随机序列。其他实现可以生成实际的随机数,而另一些实现则可能结合使用这两项技术。

加密的强随机数至少要遵从《FIPS 140-2, Security Requirements for Cryptographic Modules》中 4.9.1 部分指定的统计随机数生成器测试。另外,SecureRandom 还必须产生非确定性输出,因此,正如以下文章中所描述的那样,要求种子材料必须是不可预知的,SecureRandom 的输出必须是加密的强序列:《RFC 1750:Randomness Recommendations for Security》。

与 Java Security 中其他基于算法的类一样,SecureRandom 也提供了与实现无关的算法,因此,调用方(应用程序代码)会请求特定的 RNG 算法并将它传回到该算法的 SecureRandom 对象中。如果需要,还可以通过特定的提供程序请求特定的算法。请参见 getInstance 方法。

因此,有以下两种请求 SecureRandom 对象的方法:仅指定算法名称,或者既指定算法名称又指定包提供程序。

SecureRandom 实现尝试完全随机化生成器本身的内部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法:

      SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
      random.setSeed(seed);
 

在调用方从 getInstance 调用中获得 SecureRandom 对象之后,它可以调用 nextBytes 来生成随机字节:

      byte bytes[] = new byte[20];
      random.nextBytes(bytes);
 

调用方还可以调用 generateSeed 方法来生成给定的种子字节数(例如,为其他随机数量生成器提供种子):

      byte seed[] = random.generateSeed(20);
 

另请参见:
SecureRandomSpi, Random, 序列化表格

构造方法摘要
  SecureRandom()
          通过使用此构造方法,调用方可获取一个 SecureRandom 对象,该对象包含的实现来自具有 SecureRandom 实现的最高优先级已安装提供程序。
  SecureRandom(byte[] seed)
          通过使用此构造方法,调用方可获取一个 SecureRandom 对象,该对象包含的实现来自具有 SecureRandom 实现的最高优先级已安装提供程序。
protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
          创建 SecureRandom 对象。
 
方法摘要
 byte[] generateSeed(int numBytes)
          返回给定的种子字节数量,该数量可使用此类用来为其自身提供种子的种子生成算法来计算。
 String getAlgorithm()
          返回此 SecureRandom 对象实现的算法的名称。
static SecureRandom getInstance(String algorithm)
          生成实现指定随机数生成器 (RNG) 算法的 SecureRandom 对象。
static SecureRandom getInstance(String algorithm, Provider provider)
          如果提供程序能够提供此种 RNG 实现,则为指定的 RNG 算法(由指定的提供程序提供)生成 SecureRandom 对象。
static SecureRandom getInstance(String algorithm, String provider)
          如果提供程序能够提供此种 RNG 实现,则为指定的 RNG 算法(由指定的提供程序提供)生成 SecureRandom 对象。
 Provider getProvider()
          返回此 SecureRandom 对象的提供程序。
static byte[] getSeed(int numBytes)
          返回给定的种子字节数量,该数量可使用此类用来为其自身提供种子的种子生成算法来计算。
protected  int next(int numBits)
          生成一个包含用户指定伪随机位数的整数(右对齐,带前导零)。
 void nextBytes(byte[] bytes)
          生成用户指定的随机字节数。
 void setSeed(byte[] seed)
          重新提供此随机对象的种子。
 void setSeed(long seed)
          使用给定 long seed 中包含的八个字节,重新提供此随机对象的种子。
 
从类 java.util.Random 继承的方法
nextBoolean, nextDouble, nextFloat, nextGaussian, nextInt, nextInt, nextLong
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

构造方法详细信息

SecureRandom

public SecureRandom()

通过使用此构造方法,调用方可获取一个 SecureRandom 对象,该对象包含的实现来自具有 SecureRandom 实现的最高优先级已安装提供程序。

注意,尚未提供 SecureRandom 的这一实例的种子。对 setSeed 方法的调用将为 SecureRandom 对象提供种子。如果未调用过 setSeed,则对 nextBytes 方法的初次调用将强制 SecureRandom 对象为其自身提供种子。

提供的这一构造方法是向后兼容的。鼓励调用方使用其中一种替代 getInstance 方法来获得 SecureRandom 对象。


SecureRandom

public SecureRandom(byte[] seed)

通过使用此构造方法,调用方可获取一个 SecureRandom 对象,该对象包含的实现来自具有 SecureRandom 实现的最高优先级已安装提供程序。此构造方法使用了一种用户提供的种子,它优先于在空构造方法描述中所提到的自供种子算法。如果调用方对某种物理设备(例如,辐射探测器或噪声二极管)中的高质量随机字节有访问权,则此构造方法可能会优于空构造方法。

提供的这一构造方法是向后兼容的。鼓励调用方使用其中一种替代 getInstance 方法来获得 SecureRandom 对象,然后调用 setSeed 方法为其提供种子。

参数:
seed - 种子。

SecureRandom

protected SecureRandom(SecureRandomSpi secureRandomSpi,
                       Provider provider)
创建 SecureRandom 对象。

参数:
secureRandomSpi - SecureRandom 实现。
provider - 提供程序。
方法详细信息

getInstance

public static SecureRandom getInstance(String algorithm)
                                throws NoSuchAlgorithmException
生成实现指定随机数生成器 (RNG) 算法的 SecureRandom 对象。如果默认的 provider 包提供了所请求算法的实现,则返回包含该实现的 SecureRandom 实例。如果默认包中不存在该算法,则搜索其他包。

注意,尚未提供返回的 SecureRandom 实例的种子。对 setSeed 方法的调用将为 SecureRandom 对象提供种子。如果未调用过 setSeed,则对 nextBytes 方法的初次调用将强制 SecureRandom 对象为其自身提供种子。

参数:
algorithm - RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
返回:
新的 SecureRandom 对象。
抛出:
NoSuchAlgorithmException - 如果在调用方的环境中未提供 RNG 算法。
从以下版本开始:
1.2

getInstance

public static SecureRandom getInstance(String algorithm,
                                       String provider)
                                throws NoSuchAlgorithmException,
                                       NoSuchProviderException
如果提供程序能够提供此种 RNG 实现,则为指定的 RNG 算法(由指定的提供程序提供)生成 SecureRandom 对象。

注意,尚未提供返回的 SecureRandom 实例的种子。对 setSeed 方法的调用将为 SecureRandom 对象提供种子。如果未调用过 setSeed,则对 nextBytes 方法的初次调用将强制 SecureRandom 对象为其自身提供种子。

参数:
algorithm - RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
provider - 提供程序的名称。
返回:
新的 SecureRandom 对象。
抛出:
NoSuchAlgorithmException - 如果提供程序不能提供请求的 RNG 实现。
NoSuchProviderException - 如果尚未配置提供程序。
IllegalArgumentException - 如果提供程序的名称为 null 或空。
从以下版本开始:
1.2
另请参见:
Provider

getInstance

public static SecureRandom getInstance(String algorithm,
                                       Provider provider)
                                throws NoSuchAlgorithmException
如果提供程序能够提供此种 RNG 实现,则为指定的 RNG 算法(由指定的提供程序提供)生成 SecureRandom 对象。注:该 provider 不必被注册。

注意,尚未提供返回的 SecureRandom 实例的种子。对 setSeed 方法的调用将为 SecureRandom 对象提供种子。如果未调用过 setSeed,则对 nextBytes 方法的初次调用将强制 SecureRandom 对象为其自身提供种子。

参数:
algorithm - RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅《Java Cryptography Architecture API Specification & Reference 》中的附录 A。
provider - 提供程序。
返回:
新的 SecureRandom 对象。
抛出:
NoSuchAlgorithmException - 如果提供程序不能提供请求的 RNG 实现。
IllegalArgumentException - 如果 provider 为 null。
从以下版本开始:
1.4
另请参见:
Provider

getProvider

public final Provider getProvider()
返回此 SecureRandom 对象的提供程序。

返回:
此 SecureRandom 对象的提供程序。

getAlgorithm

public String getAlgorithm()
返回此 SecureRandom 对象实现的算法的名称。

返回:
算法的名称,如果无法确定算法名称,则返回 unknown
从以下版本开始:
1.5

setSeed

public void setSeed(byte[] seed)
重新提供此随机对象的种子。给定种子补充而不是取代现有的种子。因此,重复调用保证了始终不会降低随机性。

参数:
seed - 种子。
另请参见:
getSeed(int)

setSeed

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

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

覆盖:
Random 中的 setSeed
参数:
seed - 种子。
另请参见:
getSeed(int)

nextBytes

public void nextBytes(byte[] bytes)
生成用户指定的随机字节数。此方法将用作由此类返回的所有随机实体的基础(种子字节除外)。

覆盖:
Random 中的 nextBytes
参数:
bytes - 用随机字节填充的数组。

next

protected final int next(int numBits)
生成一个包含用户指定伪随机位数的整数(右对齐,带前导零)。此方法将重写 java.util.Random 方法,并将为继承自类(例如,nextIntnextLongnextFloat)的所有方法提供随机位源。

覆盖:
Random 中的 next
参数:
numBits - 要生成的伪随机位数,其中 0 <= numBits <= 32。
返回:
一个 int,包含用户指定的伪随机位数(右对齐,带前导零)。

getSeed

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

包含此方法仅是为了向后兼容。鼓励调用方使用其中一种替代 getInstance 方法来获得 SecureRandom 对象,然后调用 generateSeed 方法来获取该对象中的种子字节。

参数:
numBytes - 将生成的种子字节的数量。
返回:
种子字节。
另请参见:
setSeed(byte[])

generateSeed

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

参数:
numBytes - 将生成的种子字节的数量。
返回:
种子字节。

JavaTM 2 Platform
Standard Ed. 5.0

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java 2 SDK SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2004 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策