上面介绍的3种加密技术,每一种都有自己的特点,比如散列技术用于特征值提取,对称加密速度虽快但是有私匙泄露的危险,非对称加密虽然安全但是速度却慢。基于这些情况,现在的加密技术更加趋向于将这些加密的方案组合起来使用,基于此来研发新的加密算法。
MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,HMAC加密可以理解为加盐的散列算法,此处的“盐”就相当于HMAC算法的秘钥。
HMAC算法的实现过程需要一个加密用的散列函数(表示为H)和一个密钥。
经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。
MAC算法的实现:
算法
摘要长度
备注
HmacMD5
128
JAVA6实现
HmacSHA1
160
JAVA6实现
HmacSHA256
256
JAVA6实现
HmacSHA384
384
JAVA6实现
HmacSHA512
512
JAVA6实现
HmacMD2
128
BouncyCastle实现
HmacMD4
128
BouncyCastle实现
HmacSHA224
224
BouncyCastle实现
过程如下:
在密钥key后面添加0来创建一个长为B(64字节)的字符串(str);
将上一步生成的字符串(str) 与ipad(0x36)做异或运算,形成结果字符串(istr);
将数据流data附加到第二步的结果字符串(istr)的末尾;
做md5运算于第三步生成的数据流(istr);
将第一步生成的字符串(str) 与opad(0x5c)做异或运算,形成结果字符串(ostr),再将第四步的结果(istr) 附加到第五步的结果字符串(ostr)的末尾做md5运算于第6步生成的数据流(ostr),最终输出结果(out)
注意:如果第一步中,key的长度klen大于64字节,则先进行md5运算,使其长度klen = 16字节。
JDK中的实现: