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