HMAC的加密:
HMAC (k,m) = H ( (k XOR opad ) + H( (k XORipad ) + m ) )
H 是一个Hash函数, 比如, MD5, SHA-1and SHA-256,
k 是一个密钥,从左到右用0填充到hash函数规定的block的长度,如果密钥长度大于block的长度,就对先对输入key作hash。
m 是需要认证的消息,
代表“连接”运算,
XOR 代表异或运算,
opad 是外部填充常数(0x5c5c5c…5c5c,一段十六进制常量)
ipad 是内部填充常数(0x363636…3636,一段十六进制常量)
HMAC-MD5流程
输入消息串m:123456(utf8)
密钥k: 12345(utf8)
result:b8e91a37b5a5b21ea7aec961b3eea43b
如何从明文变成密文的呢?中间经过哪些步骤
第1步:
对密钥k进行填充,填充到一个分组长度。如果密钥k超过一个分组长度,对k作hash然后在填充到一个分组长度
hmac-md5:k需要填充到512比特--128hex--64字节
k = 3132333435(16进制)
填充后长度128:31323334350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
第2步:
填充后的密钥和0x36做异或操作
07040502033636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636
第三步:
将第二步的结果和消息串m(16进制)做级联
07040502033636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636313233343536
第3步:
对第3步级联的结果做hash
第4步结果:1147f3110ffb80b11ecd00d040d2ed5e
第5步:
填充后的密钥和0x5c做异或操作
第5步结果:
6d6e6f68695c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
第6步:
将第5步的结果和第4步结果hash的结果级联
第6步结果
6d6e6f68695c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c1147f3110ffb80b11ecd00d040d2ed5e
第7步:
对第6步的结果做hash
第7步的结果:
b8e91a37b5a5b21ea7aec961b3eea43b
第7步产生的结果和result结果一致
经过上面7个步骤:在整个运算过程中加了2次盐,做了2次hash(至少做了两次hash,如果密钥长度大于一个分组长度就是3次hash)
常见的HMAC种类
算法种类 摘要长度(bit)
HMAC-MD5 128
HMAC-SHA1 160
HMAC-SHA256 256
HMAC-SHA384 384
HMAC-SHA512 512