java.lang.Object java.util.Random java.security.SecureRandom
public class SecureRandom
此类提供强加密随机数生成器 (RNG)。
强加密随机数至少要遵从 FIPS 140-2, Security Requirements for Cryptographic Modules 中 4.9.1 部分指定的统计随机数生成器测试。此外,SecureRandom 还必须生成非确定性输出。因此,根据 RFC 1750: Randomness Recommendations for Security 中的描述,任何传递给 SecureRandom 对象的种子材料必须是不可预知的,所有 SecureRandom 的输出序列必须是强加密的。
调用者可通过无参数构造方法或一个 getInstance
方法获取 SecureRandom 实例:
SecureRandom random = new SecureRandom();
许多 SecureRandom 实现是伪随机数生成器 (PRNG) 的形式,这意味着它们将使用确定的算法根据实际随机种子生成伪随机序列。 其他实现可以生成实际随机数,而另一些实现则可能结合使用这两项技术。
通常,SecureRandom 的调用者调用以下方法获取随机字节:
SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes);
调用者还可以调用 generateSeed
方法生成给定的种子字节数(例如,为其他随机数生成器提供种子):
byte seed[] = random.generateSeed(20);
SecureRandomSpi
,
Random
,
序列化表格
构造方法摘要 | |
---|---|
|
SecureRandom() 构造一个实现默认随机数算法的安全随机数生成器 (RNG)。 |
|
SecureRandom(byte[] seed) 构造一个实现默认随机数算法的安全随机数生成器 (RNG)。 |
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) 算法的 SecureRandom 对象。 |
static SecureRandom |
getInstance(String algorithm, String provider) 返回实现指定随机数生成器 (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 |
构造方法详细信息 |
---|
public SecureRandom()
此构造方法从首选 Provider 开始,遍历已注册安全提供者列表。返回一个封装 SecureRandomSpi 实现的新 SecureRandom 对象,该实现取自第一个支持 SecureRandom (RNG) 算法的 Provider。如果没有 Provider 支持 RNG 算法,则返回一个特定于实现的默认对象。
注意,已注册提供者列表可以通过 Security.getProviders()
方法获得。
有关标准 RNG 算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference 的附录 A。
尚未设置返回 SecureRandom 对象的种子。要设置返回对象的种子,可以调用 setSeed
方法。 如果没有调用 setSeed
,那么第一次调用 nextBytes
时将强行将 SecureRandom 对象设置为自身的种子。 如果之前调用了 setSeed
,则不会发生该操作。
public SecureRandom(byte[] seed)
此构造方法从首选 Provider 开始,遍历已注册安全提供者列表。返回一个封装 SecureRandomSpi 实现的新 SecureRandom 对象,该实现取自第一个支持 SecureRandom (RNG) 算法的 Provider。如果没有 Provider 支持 RNG 算法,则返回一个特定于实现的默认对象。
注意,已注册提供者列表可以通过 Security.getProviders()
方法获得。
有关标准 RNG 算法名称的信息,请参阅 Java Cryptography Architecture API Specification & Reference 的附录 A。
seed
- 种子。
protected SecureRandom(SecureRandomSpi secureRandomSpi, Provider provider)
secureRandomSpi
- SecureRandom 实现。
provider
- 提供者。
方法详细信息 |
---|
public static SecureRandom getInstance(String algorithm) throws NoSuchAlgorithmException
此方法从首选 Provider 开始,遍历已注册安全提供者列表。返回一个封装 SecureRandomSpi 实现的新 SecureRandom 对象,该实现取自第一个支持指定算法的 Provider。
注意,已注册提供者列表可以通过 Security.getProviders()
方法获得。
尚未设置返回 SecureRandom 对象的种子。要设置返回对象的种子,可以调用 setSeed
方法。 如果没有调用 setSeed
,那么第一次调用 nextBytes
时将强行将 SecureRandom 对象设置为自身的种子。 如果之前调用了 setSeed
,则不会发生该操作。
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅
Java Cryptography Architecture API Specification & Reference 中的附录 A。
NoSuchAlgorithmException
- 如果没有任何 Provider 支持指定算法的 SecureRandomSpi 实现。
Provider
public static SecureRandom getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
返回一个封装 SecureRandomSpi 实现的新 SecureRandom 对象,该实现取自指定提供者。指定的提供者必须已在安全提供者列表中注册。
注意,已注册提供者列表可以通过 Security.getProviders()
方法获得。
尚未设置返回 SecureRandom 对象的种子。要设置返回对象的种子,可以调用 setSeed
方法。 如果没有调用 setSeed
,那么第一次调用 nextBytes
时将强行将 SecureRandom 对象设置为自身的种子。 如果之前调用了 setSeed
,则不会发生该操作。
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅
Java Cryptography Architecture API Specification & Reference 中的附录 A。
provider
- 提供者的名称。
NoSuchAlgorithmException
- 如果不能从指定提供者获得指定算法的 SecureRandomSpi 实现。
NoSuchProviderException
- 如果指定提供者没有在安全提供者列表中注册。
IllegalArgumentException
- 如果提供者的名称为 null 或空。
Provider
public static SecureRandom getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
返回一个封装 SecureRandomSpi 实现的新 SecureRandom 对象,该实现取自指定 Provider 对象。注意,指定的 Provider 对象无需在安全提供者列表中注册。
尚未设置返回 SecureRandom 对象的种子。要设置返回对象的种子,可以调用 setSeed
方法。 如果没有调用 setSeed
,那么第一次调用 nextBytes
时将强行将 SecureRandom 对象设置为自身的种子。 如果之前调用了 setSeed
,则不会发生该操作。
algorithm
- RNG 算法的名称。有关标准 RNG 算法名称的信息,请参阅
Java Cryptography Architecture API Specification & Reference 中的附录 A。
provider
- 提供者。
NoSuchAlgorithmException
- 如果不能从指定的 Provider 对象获得指定算法的 SecureRandomSpi 实现。
IllegalArgumentException
- 如果指定提供者为 null。
Provider
public final Provider getProvider()
public String getAlgorithm()
unknown
。
public void setSeed(byte[] seed)
seed
- 种子。
getSeed(int)
public void setSeed(long seed)
long seed
中包含的八个字节,重新设置此随机对象的种子。给定种子补充而不是取代现有的种子。因此,保证重复调用不会降低随机性。
定义此方法是为了与 java.util.Random
兼容。
seed
- 种子。
getSeed(int)
public void nextBytes(byte[] bytes)
如果之前没有调用过 setSeed
,那么第一次调用此方法时将强行将此 SecureRandom 对象设置为自身的种子。 如果之前调用了 setSeed
,则不会发生该操作。
bytes
- 用随机字节填充的数组。
protected final int next(int numBits)
java.util.Random
方法,并将为继承自类的所有方法(例如,
nextInt
、
nextLong
和
nextFloat
)提供随机位源。
numBits
- 要生成的伪随机位数,其中 0 <=
numBits
<= 32。
int
,包含用户指定的伪随机位数(右对齐,带前导零)。
public static byte[] getSeed(int numBytes)
包含此方法只是为了向后兼容。建议调用者使用一个替代 getInstance
方法来获取 SecureRandom 对象,然后调用 generateSeed
方法获取该对象中的种子字节。
numBytes
- 将生成的种子字节数量。
setSeed(byte[])
public byte[] generateSeed(int numBytes)
numBytes
- 将生成的种子字节数量。