介绍
HMAC(Hash-based Message Authentication Code是一种基于哈希函数的消息认证码(MAC
)算法,用于验证数据的完整性和真实性。它通过结合哈希算法与密钥来生成一个认证码,可以防止数据在传输过程中被篡改。HMAC
广泛应用于网络协议(如 TLS
、IPSec
等)、数字签名以及 API
认证等场景中。
在这篇文章中,我们将深入了解 HMAC
的原理,并通过具体的计算过程来说明其如何工作。
HMAC的工作原理
HMAC
的工作原理可以通过以下几个步骤来描述:
选择哈希算法:
HMAC
可以使用任何哈希函数,如 $MD5$、$SHA\text{-}1$、$SHA\text{-}256$等。算法的选择通常取决于安全要求及性能需求。密钥处理:
HMAC
算法需要一个密钥。如果密钥的长度小于哈希函数的块大小,则需要对密钥进行填充,在末尾填充 $0$。如果密钥的长度大于块大小,则首先对密钥进行哈希处理,使得密钥的长度与块大小一致。内外填充:在
HMAC
中,密钥会被分别与两个常量值($ipad$ 和 $opad$)进行组合:- $ipad$(内填充):一个由 $0x36$ 组成的块(长度等于哈希函数的块大小)。
- $opad$(外填充):一个由 $0x5C$ 组成的块(长度等于哈希函数的块大小)。
计算过程:
HMAC
的计算分为两个主要步骤:- 内层哈希:首先将密钥与 $ipad$ 进行异或运算,得到一个新的密钥。然后,将该新密钥与消息数据进行连接,并计算哈希值。
- 外层哈希:接着,将密钥与 $opad$ 进行异或运算,得到一个新的密钥。然后,将该新密钥与第一步得到的哈希值进行连接,并计算哈希值。最终得到的哈希值就是
HMAC
值。
$$
\mathrm{HMAC}(K, m) = H\left((K’ \oplus \text{opad}) \,\|\, H\left((K’ \oplus \text{ipad}) ,|, m\right)\right)
$$
其中:
- \( H \):哈希函数(如 SHA-256)
- \( K \):原始密钥
- \( m \):消息
- \( K’ \):处理后的密钥,如果 \( K \) 长度大于块长度,则先哈希再填充,否则直接填充到块长度
- \( \text{opad} \):外部填充常量,重复字节
0x5c
- \( \text{ipad} \):内部填充常量,重复字节
0x36
- \( \| \):表示字节连接
- \( \oplus \):按位异或
HMAC的计算过程
下面通过具体的计算例子来详细说明 HMAC
的生成过程。假设我们使用 $SHA\text{-}256$ 哈希算法,并且给定一个密钥和消息。
步骤1:准备工作
假设:
- 密钥:$K = “key”$
- 消息:$M = “The quick brown fox jumps over the lazy dog”$
首先,$SHA\text{-}256$ 的块大小为 $64$ 字节($512$ 位),因此我们需要将密钥扩展或截断为 $64$ 字节的长度。如果密钥小于 $64$ 字节,则通过补零使其长度达到 $64$ 字节。
密钥扩展后:
1 | K = "key" => 0x6B65790000000000000000000000000000000000000000000000000000000000 |
步骤2:内层计算
将密钥与 $ipad$($0x36$ 的重复块)进行异或,得到内层密钥:
1 | K ⊕ ipad = 0x6B65790000000000000000000000000000000000000000000000000000000000 |
接着,将内层密钥与消息 M
进行拼接,并对拼接后的数据进行 $SHA\text{-}256$ 哈希计算:
$$
H_1 = \mathrm{SHA\text{-}256}\left((K \oplus \mathrm{ipad}) \,\|\, M\right)
$$
步骤3:外层计算
将密钥与 $opad$($0x5C$ 的重复块)进行异或,得到外层密钥:
1 | K ⊕ opad = 0x6B65790000000000000000000000000000000000000000000000000000000000 |
然后,将外层密钥与第一步计算得到的哈希值 $H_1$ 进行拼接,并对拼接后的数据进行 $SHA\text{-}256$ 哈希计算:
$$
HMAC = \mathrm{SHA\text{-}256}\left((K \oplus \mathrm{opad}) \,\|\, H_1\right)
$$
最终,得到的 HMAC
就是我们需要的消息认证码。
HMAC的安全性
HMAC
的安全性依赖于两个因素:
哈希函数的安全性:如果选择的哈希函数本身存在安全漏洞(如碰撞攻击),则
HMAC
的安全性也会受到影响。密钥的管理:
HMAC
依赖于密钥的机密性。如果密钥泄露,HMAC
的安全性将大大降低。
因此,建议使用强大的哈希算法(如 $SHA\text{-}256$ 或更高版本的算法),并采取合适的措施管理密钥。
HMAC的应用场景
HMAC
有许多应用场景,以下是一些常见的例子:
API
认证:通过HMAC
可以确保请求的数据未被篡改,并且能够验证请求者的身份。数字签名:
HMAC
可用于签名消息,确保消息的完整性。加密协议:如
SSL/TLS
,HMAC
用于保证数据在传输过程中不被篡改。
总结
HMAC
是一种简单而强大的消息认证码算法,它结合了哈希函数和密钥的特性,能够有效地验证消息的完整性和真实性。通过理解 HMAC
的工作原理和计算过程,我们可以更好地应用它来增强我们的数据保护能力。