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类中辅助完成初始化操作。