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();