3.3.2 KeyGenerator

KeyGenerator类与KeyPairGenerator类相似,KeyGenerator类用来生成秘密密钥,我们称它为秘密密钥生成器。


//生成用于对称加密算法的秘密密钥,并提供相关信息。

public class KeyGenerator

extends Object


Java 6版本中提供了Blowfish、AES、DES和DESede等多种对称加密算法实现,以及HmacMD5、HmacSHA1和HmacSHA256等多种安全消息摘要算法实现。

关于Java 6版本中提供的算法信息,请参见附录。

❑方法详述

与KeyPairGenerator类相似,KeyGenerator类通过如下方法获得实例化对象:


//返回生成指定算法的秘密密钥的KeyGenerator对象。

public static final KeyGenerator getInstance(String algorithm)


另一种方式就是指定算法名称的同时指定该算法的提供者,方法如下所示:


//返回生成指定算法的秘密密钥的KeyGenerator对象。

public static final KeyGenerator getInstance(String algorithm, Provider provider)

//返回生成指定算法的秘密密钥的KeyGenerator对象。

public static final KeyGenerator getInstance(String algorithm, String provider)


KeyGenerator对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个KeyGenerator对象来生成更多的密钥。

生成密钥的方式有两种:与算法无关的方式和特定于算法的方式。这一点与KeyPairGenerator类生成密钥方式相类似。

两者之间的唯一不同是对象的初始化:

·与算法无关的初始化

所有密钥生成器都具有密钥大小和随机源的概念。KeyGenerator类中有一个init()方法,它带有这两个通用共享类型的参数。还有一个只带有keysize参数的init()方法,它使用具有最高优先级的已安装提供者的SecureRandom实现作为随机源(如果已安装的提供者都不提供SecureRandom实现,则使用系统提供的随机源)。KeyGenerator类还提供一个只带随机源参数的init()方法。

因为调用上述与算法无关的init()方法时未指定其他参数,所以由提供者决定如何处理要与每个密钥关联的特定于算法的参数(如果有)。

·特定于算法的初始化

在已经存在特定于算法的参数集的情况下,有两个带AlgorithmParameterSpec参数的init()方法。其中一个方法还有一个SecureRandom参数,而另一个方法将具有高优先级的已安装提供者的SecureRandom实现作为随机源(如果安装的提供者都不提供SecureRandom实现,则使用系统提供的随机源)。

如果客户端没有显式地初始化KeyGenerator(通过调用init()方法),那么每个提供者都必须提供(并记录)默认初始化。

与算法无关的初始化方法如下:


//初始化此KeyGenerator。

public final void init(SecureRandom random)

//初始化此KeyGenerator,使其具有确定的密钥大小。

public final void init(int keysize)

//使用用户提供的随机源初始化此KeyGenerator,使其具有确定的密钥大小。

public final void init(int keysize, SecureRandom random)


特定于算法的初始化方法如下:


//用指定参数集初始化此KeyGenerator。

public final void init(AlgorithmParameterSpec params)

//用指定参数集和用户提供的随机源初始化此KeyGenerator。

public final void init(AlgorithmParameterSpec params, SecureRandom random)


完成初始化操作后,我们就可以通过以下方法获得秘密密钥:


//生成一个SecretKey对象。

public final SecretKey generateKey()


与其他引擎类一样,KeyGenerator类提供如下两种方法:


//返回此秘密密钥生成器对象的算法名称。

public final String getAlgorithm()

//返回此秘密密钥生成器对象的提供者。

public final Provider getProvider()


❑实现示例


//实例化KeyGenerator对象,并指定HmacMD5算法。

KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5");

//生成SecretKey对象。

SecretKey secretKey=keyGenerator.generateKey();