3.3 javax.crypto包详解

javax. crypto包为加密操作提供类和接口。在上一节内容中,我们了解了如何实现消息摘要算法、获得对称密钥等API内容。但是,如果缺乏Cipher类,我们将无法完成加密与解密的实现。

在本节内容中,读者将可以完成完整的算法实现,以及安全摘要算法的实现。

3.3.1 Mac

Mac属于消息摘要的一种,但它不同于一般消息摘要(如MessageDigest提供的消息摘要实现),仅通过输入数据无法获得消息摘要,必须有一个由发送方和接收方共享的秘密密钥才能生成最终的消息摘要—安全消息摘要。安全消息摘要也称为消息认证(鉴别)码(Message Authentication Code, Mac)。

在Java 6版本中支持HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512算法。

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


//实现创建和验证安全消息摘要的操作。

public class Mac

extends Object

implements Cloneable


❑方法详述

Mac与MessageDigest绝大多数方法相同,我们可以通过以下方法获得它的实例:


//返回实现指定摘要算法的Mac对象。

public final static Mac getInstance(String algorithm)


或者,指定算法名称的同时指定该算法的提供者。


//返回实现指定摘要算法的Mac对象。

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

//返回实现指定摘要算法的Mac对象。

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


目前,Mac类支持HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA5125种消息摘要算法。

在获得Mac实例化对象后,需要通过给定的密钥对Mac对象初始化,方法如下所示:


//用给定的密钥初始化此Mac。

public final void init(Key key)

//用给定的密钥和算法参数初始化此Mac。

public final void init(Key key, AlgorithmParameterSpec params)


这里的密钥Key指的是秘密密钥,请使用该密钥作为init()方法的参数。

Mac类更新摘要方法与MessageDigest类相同,方法如下所示:


//使用指定的字节更新摘要。

public final void update(byte input)

//使用指定的字节数组更新摘要。

public final void update(byte[]input)


上述方法传入参数不同,前一个传入的是字节,后一个传入的是字节数组。

我们也可以通过输入偏移量的方式做更新操作,方法如下所示:


//使用指定的字节数组,从指定的偏移量开始更新摘要。

public final void update(byte[]input, int offset, int len)


当然,我们还可以使用缓冲方式,方法如下所示:


//使用指定的字节缓冲更新摘要。

public final void update(ByteBuffer input)


与MessageDigest类相同,更新摘要信息,其参数可以是更新一个字节、一个字节数组甚至是字节数组中的某一段偏移量,也可以是字节缓冲对象。

这些方法的调用顺序不受限制,在向摘要中增加所需数据时可以多次调用。

在完成摘要更新后,我们可以通过以下方法完成摘要操作:


//完成摘要操作

public final byte[]doFinal()

/使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回消息摘要字节数组。/

public final byte[]doFinal(byte[]input)

//完成摘要操作,按指定的偏移量将摘要信息保存在字节数组中。

public final void doFinal(byte[]output, int outOffset)


与MessageDigest类相同,Mac类也有重置方法:


//重置摘要以供再次使用。

public final void reset()


执行该重置方法等同于创建一个新的Mac实例化对象。

除了上述方法外,还常用到以下几个方法:


/返回以字节为单位的摘要长度,如果提供者不支持此操作并且实现是不可复制的,则返回0。/

public final int getMacLength()

//返回算法名称,如HmacMD5。

public final String getAlgorithm()

//返回此信息摘要对象的提供者。

public final Provider getProvider()


❑实现示例

安全消息摘要算法实现也较为简单,如代码清单3-17所示。

代码清单3-17 HmacMD5算法摘要处理


//待做安全消息摘要的原始信息

byte[]input="MAC".getBytes();

//初始化KeyGenerator对象,使用HmacMD5算法

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

//构建SecretKey对象

SecretKey secretKey=keyGenerator.generateKey();

//构建Mac对象

Mac mac=Mac.getInstance(secretKey.getAlgorithm());

//初始化Mac对象

mac.init(secretKey);

//获得经过安全消息摘要后的信息

byte[]output=mac.doFinal(input);