5.3 HMAC
散列算法设计出来后,人们希望使用散列函数而不是分组密码构造MAC,因为散列函数一般速度快,没有出口限制。由于散列函数不依赖于秘密密钥,不能直接用于MAC,最早提议基于下述办法构造基于密钥的散列函数:
KeyedHash = Hash(Key||Message)
但由于发现了上述方法的一些弱点,最终导致了HMAC的出现。HMAC作为RFC 2104并在SSL中使用。
RFC 2104给出了HMAC的设计目标:
● 无须修改地使用现有的散列函数。
● 当出现新的散列函数时,要能轻易地替换。
● 保持散列函数的原有性能不会导致算法性能的降低。
● 使用和处理密钥的方式简单。
● 对鉴别机制的安全强度容易分析,与散列函数有同等的安全性。
HMAC可描述如下:
HMACK = H[K+ ⊕ opad)|| H(K+ ⊕ ipad)|| M]]
上式中的符号定义如下:
H——嵌入散列函数(MD5,SHA-1等)
M——消息(包括散列函数所需填充位)
Yi——M的第i个数据块,0≤ i≤ L-1
L——M的数据块数
b——数据块的位数
m——嵌入散列函数产生的散列码长度位数
K——保密密钥,如果密钥长度大于b,则密钥送入散列函数,形成一个m位的密钥;推荐长度大于等于m
K+——K在左部添加0使得其长度为b位
ipad——00110110重复b/8次
opad——01011010重复b/8次
具体产生步骤如下:
(1)对密钥K左边补0以产生一个hash用块K+。
(2)K+每个字节与ipad(00110110)作XOR以产生S1=K+ ⊕ ipad。
(3)对(Si||M)进行hash。
(4)K+每个字节与opad(01011010)作XOR以产生S0=K+ ⊕ ipad。
(5)HMACK = H[S0|| H(S1 || M)] = H[K+ ⊕ opad)|| H[(K+ ⊕ ipad)|| M]]。