MAC算法综合了MD和SHA算法的特性,和MD、SHA算法类似。
MAC算法家族发展历史
MAC算法是含有密钥的散列算法,兼容MD和SHA算法,在此基础上添加了密钥支持,因此也被称为HMAC算法,定义在RFC 2014中,分为两大分支MD和SHA分支:
- MD分支:HmacMD2、HmacMD4、HmacMD5;
- SHA分支:HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512、HmacSHA224
应用场景
MAC算法应用场景也可用在MD和SHA场景下,当更多的用在密钥交换上:
- AB双方公布MAC算法;
- A公布密钥给B;
- A使用密钥对消息做摘要后,发送摘要给B;
- B收到消息,使用密钥对数据做摘要验证是否一致;
MAC的应用更类似现在的MD5 加 Slat方式,但是更安全。
Java中算法实现
算法 | 摘要长度 | 备注 |
---|---|---|
HmacMD5 | 128 | JDK 6提供 |
HmacSHA1 | 160 | JDK 6提供 |
HmacSHA256 | 256 | JDK 6提供 |
HmacSHA384 | 384 | JDK 6提供 |
HmacSHA512 | 512 | JDK 6提供 |
HmacMD2 | 128 | Bouncy Castle实现 |
HmacMD4 | 128 | Bouncy Castle实现 |
HmacSHA224 | 224 | Bouncy Castle实现 |
MAC算法的使用,使用MAC类,MAC类要求进行初始化init的时候设置一个密钥,这个密钥一般是有长度要求的,大部分情况下配合使用KeyGenerator产生,KeyGenerator可以根据传入的算法,产生适合算法要求的密钥长度的秘钥,示例代码如下:
public class MACTest {
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {
// 产生一个密钥,MAC的密钥加密时有一定长度要求,可以手动自己按照规定长度产生一个,但是不建议使用
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey = keyGen.generateKey();
byte[] key = secretKey.getEncoded();
// 接收方接受密钥后进行信息摘要
String input = "test";
SecretKey sKey = new SecretKeySpec(key, "HmacMD5");
Mac mac = Mac.getInstance("HmacMD5");
mac.init(sKey);
byte[] sData = mac.doFinal(input.getBytes());
System.out.println(new String(HexBin.encode(sData)));
}
}