3.2.12 SecureRandom
SecureRandom类继承于Random类(java.util.Random),它起到强加密随机数生成器(Random Number Generator, RNG)的作用,我们称它为安全随机数生成器,它同样是一个引擎类。
//提供安全随机数。
publicclass SecureRandom
extends Random
❑方法详述
安全随机数生成器可通过以下构造方法进行实例化对象:
//构造一个实现默认随机数算法的SecureRandom对象。
public SecureRandom()
//在给定种子的前提下,构造一个实现默认随机数算法的SecureRandom对象。
public SecureRandom(byte[]seed)
当然,我们可以通过给定的其他参数,使用getInstance()工厂方法来完成实例化对象。
我们可以通过指定算法名称的方式获得安全随机数对象,方法如下所示:
//返回实现指定随机数生成器算法的SecureRandom对象。
public static SecureRandom getInstance(String algorithm)
或者,指明该算法名的同时指定该算法的提供者:
//返回实现指定随机数生成器算法的SecureRandom对象。
public static SecureRandom getInstance(String algorithm, Provider provider)
//返回实现指定随机数生成器算法的SecureRandom对象。
public static SecureRandom getInstance(String algorithm, String provider)
SHA1PRNG算法是SecureRandom的默认算法。
在获得实例化对象后,可以多次使用如下方法生成种子:
/返回给定的种子字节数量,该数量可使用此类用来将自身设置为种子的种子生成算法来计算。/
public byte[]generateSeed(int numBytes)
SecureRandom类覆盖了Random类的以下几个方法:
//生成用户指定的随机字节数。其结果将填充在参数byte[]bytes中。
public synchronized void nextBytes(byte[]bytes)
//使用给定long seed中包含的8个字节,重新设置此随机对象的种子。
public void setSeed(long seed)
使用如下方法将重置随机数对象中的种子:
//重新设置此随机对象的种子。
public synchronized void setSeed(byte[]seed)
使用如下方法将获得新的随机数:
/返回给定的种子字节数量,该数量可使用此类用来将自身设置为种子的种子生成算法来计算。/
public static byte[]getSeed(int numBytes)
此外,安全随机数生成器作为引擎类,提供如下常用方法:
//返回此安全随机数生成器对象实现的算法的名称。
public String getAlgorithm()
//返回此安全随机数生成器对象的提供者。
public final Provider getProvider()
❑实现示例
安全随机数生成器常用来配合生成秘密密钥,如代码清单3-10所示。
代码清单3-10 构建安全随机数对象及秘密密钥对象
//实例化SecureRandom对象
SecureRandom secureRandom=new SecureRandom();
//实例化KeyGenerator对象
KeyGenerator kg=KeyGenerator.getInstance("DES");
//初始化KeyGenerator对象
kg.init(secureRandom);
//生成SecretKey对象
SecretKey secretKey=kg.generateKey();
SecureRandom类的另一个用途在数字签名Signature类中辅助完成初始化操作。