本期主要给大家简单介绍一下消息认证码中的HMAC
而HMAC就是其中的一种
HMAC的完整中文名称是:密钥相关的哈希运算消息认证码
它是由Hugo Krawezyk,Mihir Bellare,Ren Canetti等人
于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,
它作为RFC2104被公布,
并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。
目前主要应用在服务器对访问者进行鉴权认证流程中。
可能有些同学就会有疑问
这个HMAC为什么会被提出来?
是MAC的产生有什么缺陷么?
下面来简单介绍一下HMAC规范出现的原因
HMAC规范的设计是由于存在对将密钥与hash函数相结合的更简单机制的攻击。
换言之就是有些将密钥和hash函数结合使用产生MAC的算法容易被攻击。
而这种生成消息认证码的方法就像炸弹一样,
可能随时都会给企业和社会带来危险
例如,有些同学在想
消息验证码可不可以这样实现:
消息验证码等于对密钥和消息字符串连接的hash值
MAC = H ( key| message )
但是,这种方法有一个严重的缺陷
对于大多数散列函数,
很容易在不知道密钥的情况下将数据附加到消息中并获得另一个有效的 MAC
(“长度扩展攻击”)
可能又有同学想到另一种方法,
使用 MAC = H ( message | key附加密钥),
但会遇到这样一个问题,
攻击者可以在未加密的散列函数中找到与MAC 中存在冲突的hash值。
于是又有同学说可以使用
MAC = H ( key| message| key ) 更好,
但有信息安全方面的论文提出了这种方法的漏洞,
即使使用两个不同的密钥也是如此。
基于上述问题,
Mihir Bellare、Ran Canetti和Hugo Krawczyk 在他们的论文中
提出了HMAC 结构的定义和分析
H 是一个密码散列函数
m是要认证的消息
K是密钥
K '是从密钥K派生的块大小的密钥;通过向右填充 0 直到块大小,或者通过先散列到小于或等于块大小,然后向右填充零
‖ 表示连接
⊕ 表示按位异或(XOR)
opad是块的外部填充,由值 0x5c 的重复字节组成,是一段十六进制常量
ipad是块的内部填充,由值 0x36 的重复字节组成,也是一段十六进制常量
下面来看看对HMAC的具体实现
首先对密钥进行规范化,转为K‘,
比如初始密钥如果不足64位,那就填充到64位变为K‘
如果超过64位,
通过hash函数转为64位的K‘
然后将K‘与ipad进行异或,
这样就可以在一定程度上隐藏密钥信息
之后对进行异或的值进行hash运算得到文本二
另一方面
我们可以看到K‘还与opad进行异或得到文本一
这也是为了隐藏密钥的信息
之后将文本一、文本二和消息进行拼接
并进行hash运算
这样就得到了我们想要的消息认证码
大致了解了HMAC的算法
再来给大家介绍一下HMAC的安全性
HMAC 的加密强度取决于所使用的密钥的大小。
针对 HMAC 的最常见攻击是暴力破解密钥。
还记得2019年获得未来科学大奖的王小云教授么?
她所在团队在2009年在不使用相关密钥的情况下
对 HMAC-MD5 进行了差分攻击
结果是可以在2的97次方次查询内
以百分之八十七的概率
区分使用md5算法加密的HMAC
而这也推动了HMAC使用其他更安全的hash函数
在2011年在RFC6151标准中总结了HMAC-md5的安全注意事项
其中提到“对 HMAC-MD5 的攻击在用作消息验证码时似乎并不表明存在实际漏洞,
但对于新的协议设计,不应包含具有 HMAC-MD5 的密码套件”