简述
HMAC(消息认证算法)可以理解就是带有秘钥的的摘要算法,它兼容MD和SHA算法的特性,并在此基础上加入了秘钥。(对摘要算法不了解的可以看我的上一篇博客 这里的摘要算法也是以MD5为例)
原理
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
H 代表所采用的HASH算法(如MD5)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B和MD5的 B= 64
SHA-384和SHA-512的 B = 128
L 表示hash的大小 MD5的L=128、SHA-1的L=160。其他的不再一一介绍。
Opad 用0x5c重复B次
Ipad 用0x36重复B次
看到这里好晕呀,那么接下来一MD5作为摘要算法来介绍这个加密算法:
1.K:秘钥 它的长度根据摘要算法处理的数据块B的大小来确定的,这里是64位 若秘钥K的长度不足64位 则需要使用0来补位达到64位,太短的秘钥是不受欢迎的 因为太短了安全性就会降低;若秘钥的长度刚好等于64位 就不用处理了;若秘钥的长度大于64位,则需要先对秘钥做摘要算法计算把结果作为秘钥key。
2.Opad 为重复64次的0x5c 就是64个0x5c组成的串。
3.同理 Ipad 是64个0x36组成的串。
(这里有个疑问 若秘钥长度小于等于64 则秘钥处理后变成长度为64的秘钥 若秘钥长度大于64 则秘钥处理后就变成了长度位128的秘钥 他和ipad和opad是如何做与或运算呢?)
算法需要的材料已备好,开始加密了.
1.用处理好的秘钥和inpad做异或运算 生成S1。
2.将待加密的数据放到S1后面 做摘要算法 这里是MD5摘要 生成H。
3.用处理好的秘钥和Opad做异或运算 生成S2。
4.将第三步的H和S2拼接到一起 用MD5做摘要 生成最终的HMAC的密文。
java代码
package util;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* @ClassName : MAC
* @Description : java中提供了 HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512四中算法支持
* @author : wangdx
* @date : 2016-3-15 下午10:05:49
*
*/
public class MAC {
public static byte[] initHmacMD5Key()throws Exception{
//初始化 KeyGenerator
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
// 产生秘钥
SecretKey secretKey = keyGenerator.generateKey();
//获得秘钥
return secretKey.getEncoded();
}
public