信息摘要技術 - MAC系列

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

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章