📜  什么是 HMAC(基于哈希的消息验证码)?

📅  最后修改于: 2022-05-13 01:57:03.154000             🧑  作者: Mango

什么是 HMAC(基于哈希的消息验证码)?

HMAC (Hash-based Message Authentication Code)是一种消息认证码(MAC),通过对要认证的数据(即)和秘密共享密钥执行加密散列函数获得。与任何 MAC 一样,它用于数据完整性和身份验证。检查数据完整性对于参与通信的各方来说是必要的。 HTTPS、SFTP、FTPS 和其他传输协议使用 HMAC。加密散列函数可以是 MD-5、SHA-1 或 SHA-256。数字签名与 HMAC 几乎相似,即它们都使用散列函数和共享密钥。区别在于密钥,即 HMAC 使用对称密钥(相同副本),而签名使用非对称密钥(两个不同的密钥)。

什么是 HMAC

历史

与业务相关的流程和决策很大程度上取决于完整性。如果攻击者篡改这些数据,可能会影响流程和业务决策。因此,在通过 Internet 在线工作时,必须注意确保数据的完整性或最少知道数据是否已更改。这就是 HMAC 开始使用的时候。

应用

  • 在激活或创建帐户期间验证电子邮件地址。
  • 发送到客户端浏览器然后提交回来的表单数据的身份验证。
  • 由于成本较低,HMAC 可用于物联网 (IoT)。
  • 每当需要重置密码时,会发送一个可以使用一次的链接,而无需添加服务器状态。
  • 它可以接收任意长度的消息并将其转换为固定长度的消息摘要。也就是说,即使您收到一条长消息,消息摘要也会很小,因此可以最大限度地提高带宽。

HMAC的工作

HMAC 为客户端和服务器提供了一个只有它们自己知道的共享私钥。客户端为每个请求创建一个唯一的哈希 (HMAC)。当客户端请求服务器时,它使用私钥对请求的数据进行哈希处理,并将其作为请求的一部分发送。消息和密钥都在单独的步骤中进行散列,使其安全。当服务器收到请求时,它会生成自己的 HMAC。比较两个 HMACS,如果两者相等,则认为客户端是合法的。

HMAC的公式:

HMAC = hashFunc(secret key + message) 

存在三种类型的认证功能。它们是消息加密、消息验证码和散列函数。 MAC 和哈希(此处为 HMAC)之间的主要区别在于密钥的依赖性。在 HMAC 中,我们必须在纯文本上应用散列函数和密钥。散列函数将应用于纯文本消息。但在应用之前,我们必须计算 S 位,然后将其附加到纯文本中,然后应用散列函数。为了生成这些 S 位,我们使用了发送者和接收者之间共享的密钥。

使用密钥 K (0 < K < b),通过在密钥 K 的左侧填充 O 直到长度变为 b 位来生成 K+。它没有在右边填充的原因是密钥长度的变化(增加)。 b 位,因为它是纯文本的块大小。有两个预定义的填充位,称为 ipad 和 opad。所有这些都是在将散列函数应用于纯文本消息之前完成的。

ipad - 00110110 
 opad - 01011100

现在我们必须计算 S 位
K+ 与 ipad 进行异或运算,结果是 S1 位,相当于 b 位,因为 K+ 和 ipad 都是 b 位。我们必须在 S1 中附加纯文本消息。令 P 为纯文本消息。
S1、p0、p1 到 Pm 各为 b 位。 m 是纯文本块的数量。 P0 是纯文本块,b 是纯文本块大小。将 S1 附加到纯文本后,我们必须应用 HASH 算法(任何变体)。同时,我们必须应用初始化向量 (IV),它是一个大小为 n 位的缓冲区。因此产生的结果是 n 位哈希码,即 H( S1 || M )。
类似地,n 位填充到 b 位,并且 K+ 与 opad 进行异或运算,产生输出 S2 位。 S2 附加到 b 位,并再次将散列函数与 IV 一起应用于块。这进一步产生了 n 位哈希码,即 H( S2 || H( S1 || M ))。

概括:

  1. 选择 K。
    如果 K < b,则在左侧填充 0,直到 k=b。 K 介于 0 和 b ( 0 < K < b ) 之间
  2. EXOR K+ 与 ipad 等效于产生 S1 位的 b 位。
  3. 用纯文本 M 附加 S1
  4. 在 ( S1 || M ) 上应用 SHA-512
  5. 填充 n 位直到长度等于 b 位
  6. EXOR K+ 与 oppad 等效于产生 S2 位的 b 位。
  7. 将步骤 5 的输出附加到 S2。
  8. 在步骤 7 中应用 SHA-512 以输出 n 位哈希码。

好处

  • HMAC 非常适合路由器等高性能系统,因为它使用了与公钥系统不同的快速计算和验证的哈希函数。
  • 数字签名比 HMAC 大,但 HMAC 提供了相对更高的安全性。
  • HMAC 用于禁止公钥系统的管理部门。

缺点

  • HMAC 使用可能导致不可否认性的共享密钥。如果发送者或接收者的密钥被泄露,那么攻击者很容易创建未经授权的消息。