信息安全原理与应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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≤ iL-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]]。