1. 什么是HMAC
HMAC是一种使用单向散列函数来构造消息认证码(MAC)的方法,其中H就代表了hash的意思。
HMAC中所使用的单向散列函数并不是仅仅局限于一种,任何获得认证的高强度的单向散列函数都可以用于HMAC的计算。
使用单向散列函数SHA-1、SHA-224、SHA-256、SHA-384、SHA-512等构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA224、HAMC-SHA256、HMAC-SHA384、HAMC-SHA512。
2. HMAC的工作步骤
步骤1: 秘钥填充
若秘钥的长度比单向散列函数的分组长度短,则需要在秘钥的末尾以0填充,直到其长度达到单向散列函数的分组长度为止。
若秘钥的长度比单向散列函数的分组长度长,则首先通过单向散列函数计算出秘钥的散列值,然后将这个散列值用作HMAC的秘钥。
步骤2: 填充后的秘钥与ipad进行“异或”处理
ipad是将比特系列00110110(即0x36)不断循环直到达到单向散列函数分组长度的比特系列,其中ipad中的i是inner(内部)的意思。异或运算之后得到的值是一个与单向散列函数分组长度相同,且与“秘钥”相关的比特系列,我们将这一比特系列称为ipadkey。
步骤3: 与消息组合
将ipadkey与消息进行组合,即将ipadkey附加在消息的开头,如下表所示:
ipadkey | message |
---|---|
步骤4: 计算散列值(或hash值) | |
将步骤3组织的数据输入到单向散列函数,计算出散列值hash1。 |
步骤5: 填充后的秘钥与opad进行“异或”处理
opad是将比特系列01011100(即0x5C)不断循环反复直到达到单向散列函数的分组长度所形成的比特系列,其中opad中的o是outer(外部)的意思。异或运算之后得到的值是一个与单向散列函数分组长度相同,且与“秘钥”相关的比特系列,我们将这一比特系列称为opadkey。
步骤6: 与散列值组合
将步骤4计算的散列值拼在opadkey的后面,如下表所示:
opadkey | hash1 |
---|---|
步骤6: 计算最终的散列值 | |
将步骤6的结果输入单向散列函数,计算得到的散列值,即为最终的MAC值。 |
3. 总结
(1)MAC值是一个与输入的消息、秘钥都相关的固定长度的比特系列;
(2)HMAC的计算涉及到两个特殊的key(ipadkey、opadkey);
(3)HMAC的MAC值的长度与选择的单向散列函数直接相关,单向散列函数的分组长度是多长,MAC值就多长。