HMAC产生背景
HMAC为什么会被提出来?是MAC的产生有什么缺陷么?
HMAC规范的设计是由于存在对将密钥与hash函数相结合的更简单机制的攻击。换言之就是有些将密钥和hash函数结合使用产生MAC的算法容易被攻击。而这种生成消息认证码的方法就像炸弹一样,可能随时都会给企业和社会带来危险。
例如:
- MAC = H ( key| message ):对于大多数散列函数,很容易在不知道密钥的情况下将数据附加到消息中并获得另一个有效的MAC。(“长度扩展攻击”)
- MAC = H ( message | key附加密钥):攻击者可以在未加密的散列函数中找到与MAC 中存在冲突的hash值。
- MAC = H ( key| message| key ):但有信息安全方面的论文提出了这种方法的漏洞,即使使用两个不同的密钥也是如此。
基于上述问题,Mihir Bellare、Ran Canetti和Hugo Krawczyk 在他们的论文中提出了HMAC 结构的定义和分析:
HMAC简介
HMAC(Hash Message Authentication Code),中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
HMAC是由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和SSL中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。HMAC是Internet协议(IP)安全的强制安全实施方法,并在Internet上广泛使用的安全套接层(SSL)协议中使用。
HMAC是一种使用单向散列函数来构造消息认证码(MAC)的方法,其中H就代表了hash的意思。HMAC中所使用的单向散列函数并不是仅仅局限于一种,任何获得认证的高强度的单向散列函数都可以用于HMAC的计算。
HMAC是含有密钥的散列函数算法,包含MD和SHA两个系列的消息摘要算法。HMAC只是在原有的MD和SHA算法的基础上添加了密钥。
MD系列:HmacMD2,HmacMD4,HmacMD5
SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512
算法 | 摘要长度 |
HmacMD2 | 128bit |
HmacMD4 | 128bit |
HmacMD5 | 128bit |
HmacSHA1 | 160bit |
HmacSHA224 | 224bit |
HmacSHA256 | 256bit |
HmacSHA384 | 384bit |
HmacSHA512 | 512bit |
HMAC流程
下面看看HMAC的内部工作原理,首先看看HMAC中使用的各个变量:
- MD=使用的消息摘要(散列)函数
- M=计算MAC的输入函数
- L=消息M的块数
- b=每块的位数(分组长度)
- K=HMAC使用的共享对称密钥
- ipad=字符串00110110重复b/8次
- opad=字符串01011010重复b/8次
根据这些输入,可以如下步骤了解HMAC的操作。
1、密钥填充
使K的长度的等于b,根据密钥K的长度,分三种情况:
1)K<b:这是需要扩展密钥(K),使得K的长度等于b(初始消息块的位数)。为此,在K左边加上足够的0;例如,如果初始密钥长度为170位,而b为512,则增加342个0位到K左边,修改后的密钥继续称为K。
2)K=b:这时不需要任何操作,直接转第2步。
3)K>b:这是需要整理K,使K的长度等于b(初始消息块的位数)。为此,使K通过为该HMAC实例选择的消息摘要算法(H),从而得到密钥K,然后将其长度整理为b。
2、K与ipad做异或运算
第一步填充后的密钥K与ipad做异或XOR运算,得到比特序列ipadkey。
其中,ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思;异或XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。
3、将消息M添加到ipadkey
将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息M的开头。
4、消息摘要算法
将第3步的输出(即ipadkey与消息M的组合)输入单向散列函数(如MD5或SHA-1),并计算出散列值H。
5、K与opad做异或运算
将第一步填充后的密钥K与被称为opad的比特序列进行XOR运算,得到比特序列opadkey。
opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。
6、将H添加到opadkey
将第4步求出的消息摘要H添加到opadkey末尾。
7、消息摘要算法
将第6步的输出(即opadkey与H的组合)输入单向散列函数(如MD5或SHA-1),并计算出散列值,这个散列值就是最终的HMAC值。
通过上述流程可以看出,最后得到的HMAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。
HMAC特点
缺点:
首先计算初始消息的指印(消息摘要),然后用对称密钥加密,只有发送方和接收方知道这个密钥,从而使接收方可以肯定消息来自正确的发送方,没有在中途被篡改。但是存在一下问题:
(1)HMAC中假设只有发送方和接收方知道,存在密钥交换问题。
(2)即使解决了密钥交换问题,HMAC也不适用于多个接收方的情形。这是因为,为了用HMAC产生MAC,就要利用对称密钥,而对称密钥是双方共享的:一个发送方,一个接收方。
(3)接收方是如何知道消息来自发送方,而不是来自其他的接收方。所有接收方都知道这个对称密钥,因此很可能以发送方的身份发一个假消息,用HMAC准备这个消息的MAC,发送消息和MAC,就像合法的发送方一样,这是无法阻止和检测的。
(4)如何证明MAC是A产生还是B产生的,A和B都知道这个对称密钥,双方都有可能生成这个消息及其MAC。
HMAC安全性
针对 HMAC 的最常见攻击是暴力破解密钥。还记得2019年获得未来科学大奖的王小云教授么?她所在团队在2009年在不使用相关密钥的情况下对 HMAC-MD5 进行了差分攻击,结果是可以在2的97次方次查询内以百分之八十七的概率区分使用md5算法加密的HMAC,而这也推动了HMAC使用其他更安全的hash函数在2011年在RFC6151标准中总结了HMAC-md5的安全注意事项。其中提到“对 HMAC-MD5 的攻击在用作消息验证码时似乎并不表明存在实际漏洞,但对于新的协议设计,不应包含具有 HMAC-MD5 的密码套件”。