1.4 MAC系列算法

信息摘要技术 - MAC系列

MAC算法综合了MD和SHA算法的特性,和MD、SHA算法类似,学名:密钥散列消息认证码,严格写法应该:Hmac-XXX算法。MAC算法支持密钥,因此不需要在使用salt方式,
但是这里要注意密钥不同于密码,salt更偏向于密码,更容易使用,密钥要经过特殊的构造,密钥在不同算法里面是要不同长度/构造方法的要求的。

MAC算法家族发展历史

MAC算法是含有密钥的散列算法,兼容MD和SHA算法,在此基础上添加了密钥支持,因此也被称为Hmac算法,定义在RFC 2014中,分为两大分支MD和SHA分支:

  • MD分支:Hmac-MD2、Hmac-MD4、Hmac-MD5;
  • SHA分支:Hmac-SHA1、Hmac-SHA256、Hmac-SHA384、Hmac-SHA512、Hmac-SHA224等;

应用场景

MAC算法应用场景也可用在MD和SHA场景下,不过其更多的被用在密钥交换上:

  • AB双方公布MAC算法;
  • A公布密钥给B;
  • A使用密钥对消息做摘要后,发送摘要给B;
  • B收到消息,使用密钥对数据做摘要验证是否一致;

MAC的应用更类似现在的MD5 加 Salt方式,但是更安全。

Java中算法实现

算法 摘要长度(位) 备注
Hmac-MD5 128 JDK 6提供
Hmac-SHA1 160 JDK 6提供
Hmac-SHA256 256 JDK 6提供
Hmac-SHA384 384 JDK 6提供
Hmac-SHA512 512 JDK 6提供
Hmac-MD2 128 Bouncy Castle实现
Hmac-MD4 128 Bouncy Castle实现
Hmac-SHA224 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)));
    }

}

你可能感兴趣的:(1.4 MAC系列算法)