信息摘要技术 - 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)));
    }

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