javax.crypto.Mac
类是JCA中提供信息认证码服务的类,用于检测消息的的正确性。可用于用户身份认证的密码存储和验证环节(取代普通的消息摘要算法)。
实例化
Mac
没有公开的构造方法,所以只能调用其静态方法getInstace
进行实现化。这个方法有多个重载如下:
public static final Mac getInstance(String algorithm) throws NoSuchAlgorithmException
public static final Mac getInstance(String algorithm, Provider provider)
throws NoSuchAlgorithmException
public static final Mac getInstance(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException
我们通常使用的是public static final Mac getInstance(String algorithm)
;此方法需要一个字符串作为参数,用于说明使用哪个MAC算法。
初始化
可用的初始化方法如下:
public final void init(Key key) throws InvalidKeyException;
public final void init(Key key, AlgorithmParameterSpec algorithmParameterSpec )
throws InvalidKeyException, InvalidAlgorithmParameterException
通常我们使用public final void init(Key key) throws InvalidKeyException;
就足够了。这个方法需要以一个Key
对象为参数对Mac
实例进行初始化。
update 方法
public final void update(byte b) throws IllegalStateException;
public final void update(byte[] bytes) throws IllegalStateException;
public final void update(byte[] bytes, int offset, int length) throws IllegalStateException;
public final void update(ByteBuffer byteBuffer);
使用指定信息更新生成的消息摘要;
reset 重置消息摘要方法
public final void reset();
重置当前实例的消息摘要,以备后用;
doFinal 生成用于信息验证码的消息摘要
public final byte[] doFinal() throws IllegalStateException;
public final byte[] doFinal(byte[] bytes) throws IllegalStateException;
生成消息摘要,并以byte数组形式返回;
如果有参数,则先使用参数调用update方法,再调用无参doFinal。
public final void doFinal(byte[] bytes, int offset) throws ShortBufferException, IllegalStateException;
把生成的消息摘要存储到指定byte数组的指定位置,返回空。
支持的算法
- HmacMd5
- hmacSha1
- hmacSha224
- hmacSha256
- hmacSha384
- hmacSha512
注:不区别大小写
示例
Mac hmacMd5 = Mac.getInstance("HmacMd5");
hmacMd5.init(new SecretKeySpec("1".getBytes(), hmacMd5.getAlgorithm()));
hmacMd5.update("1".getBytes());
System.out.println("hmacMd5:" + DatatypeConverter.printHexBinary(hmacMd5.doFinal()));
Mac hmacSha1 = Mac.getInstance("hmacSha1");
hmacSha1.init(new SecretKeySpec("1".getBytes(), hmacSha1.getAlgorithm()));
hmacSha1.update("1".getBytes());
System.out.println("hmacSha1:" + DatatypeConverter.printHexBinary(hmacSha1.doFinal()));
Mac hmacSha224 = Mac.getInstance("hmacSha224");
hmacSha224.init(new SecretKeySpec("1".getBytes(), hmacSha224.getAlgorithm()));
hmacSha224.update("1".getBytes());
System.out.println("hmacSha224:" + DatatypeConverter.printHexBinary(hmacSha224.doFinal()));
Mac hmacSha256 = Mac.getInstance("hmacSha256");
hmacSha256.init(new SecretKeySpec("1".getBytes(), hmacSha256.getAlgorithm()));
hmacSha256.update("1".getBytes());
System.out.println("hmacSha256:" + DatatypeConverter.printHexBinary(hmacSha256.doFinal()));
Mac hmacSha384 = Mac.getInstance("hmacSha384");
hmacSha384.init(new SecretKeySpec("1".getBytes(), hmacSha384.getAlgorithm()));
hmacSha384.update("1".getBytes());
System.out.println("hmacSha384:" + DatatypeConverter.printHexBinary(hmacSha384.doFinal()));
Mac hmacSha512 = Mac.getInstance("hmacSha512");
hmacSha512.init(new SecretKeySpec("1".getBytes(), hmacSha512.getAlgorithm()));
hmacSha512.update("1".getBytes());
System.out.println("hmacSha512:" + DatatypeConverter.printHexBinary(hmacSha512.doFinal()));