众所周知,Mac是Apple笔记本电脑的缩写,它是一款……开个玩笑,除了笔记本电脑之外,MAC还是一种著名的散列函数,而我们今天的主角则是MAC算法的一种——HMAC。
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。
HMAC算法的工作步骤
1: 秘钥填充
若秘钥的长度比单向散列函数的分组长度短,则需要在秘钥的末尾以0填充,直到其长度达到单向散列函数的分组长度为止。
若秘钥的长度比单向散列函数的分组长度长,则首先通过单向散列函数计算出秘钥的散列值,然后将这个散列值用作HMAC的秘钥。
2: 填充后的秘钥与ipad进行“异或”处理
ipad是将比特系列00110110(即0x36)不断循环直到达到单向散列函数分组长度的比特系列,其中ipad中的i是inner(内部)的意思。异或运算之后得到的值是一个与单向散列函数分组长度相同,且与“秘钥”相关的比特系列,我们将这一比特系列称为ipadkey。
3: 与消息组合
将ipadkey与消息进行组合,即将ipadkey附加在消息的开头。
4: 计算散列值(或hash值)
将步骤3组织的数据输入到单向散列函数,计算出散列值hash1。
5: 填充后的秘钥与opad进行“异或”处理
opad是将比特系列01011100(即0x5C)不断循环反复直到达到单向散列函数的分组长度所形成的比特系列,其中opad中的o是outer(外部)的意思。异或运算之后得到的值是一个与单向散列函数分组长度相同,且与“秘钥”相关的比特系列,我们将这一比特系列称为opadkey。
6: 与散列值组合
将步骤4计算的散列值拼在opadkey的后面。
7: 计算最终的散列值
将步骤6的结果输入单向散列函数,计算得到的散列值,即为最终的MAC值。
注意:
- MAC值是一个与输入的消息、秘钥都相关的固定长度的比特系列;
- HMAC的计算涉及到两个特殊的key(ipadkey、opadkey);
- HMAC的MAC值的长度与选择的单向散列函数直接相关,单向散列函数的分组长度是多长,MAC值就多长。
HMAC算法的缺点
首先计算初始消息的指印(消息摘要),然后用对称密钥加密,只有发送方和接收方知道这个密钥,从而使接收方可以肯定消息来自正确的发送方,没有在中途被篡改。但是会存在以下问题:
- HMAC中假设只有发送方和接收方知道,存在密钥交换问题。
- 即使解决了密钥交换问题,HMAC也不适用于多个接收方的情形。这是因为,为了用HMAC产生MAC,就要利用对称密钥,而对称密钥是双方共享的:一个发送方,一个接收方。
- 接收方是如何知道消息来自发送方,而不是来自其他的接收方。所有接收方都知道这个对称密钥,因此很可能以发送方的身份发一个假消息,用HMAC准备这个消息的MAC,发送消息和MAC,就像合法的发送方一样,这是无法阻止和检测的。
- 如何证明MAC是A产生还是B产生的,A和B都知道这个对称密钥,双方都有可能生成这个消息及其MAC。
免责声明:素材源于网络,如有侵权,请联系删稿。