哈希算法选择:
密钥:
消息格式:
HMAC结果格式:
HMAC
HMAC 是一种使用单向散列函数来构造消息认证码的方法(RFC2104),其中 HMAC 的 H 就是 Hash 的意思。

HMAC 中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于 HMAC,如果将来设计出新的单向散列函数,也同样可以使用。

使用 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 所构造的 HMAC,分别称为 HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。

HMAC 的步骤
HMAC 中是按照下列步骤来计算 MAC 值的。

(1) 密钥填充
如果密钥比单向散列函数的分组长度要短,就需要在末尾填充 0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作 HMAC 的密钥。

(2) 填充后的密钥与 ipad 的 XOR
接下来,我们使用伪随机数生成器生成会话密钥。会话密钥是用来加密消息的密钥(CEK)。

将填充后的密钥与被称为 ipad 的比特序列进行 XOR 运算。ipad(inner padding)是将 00110110 这一比特序列(即 16 进制的 36)不断循环反复直到达到分组长度所形成的比特序列。

(3)与消息组合
随后,将 ipadkey 与消息进行组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

(4)计算散列值
将(3)的结果输入单向散列函数,并计算出散列值。

(5)填充后的密钥与 opad 的 XOR
将填充后的密钥与被称为 opad 的比特序列进行 XOR 运算。opad(outer padding) 是将 01011100 这一比特序列(即 16 进制的 5C)不断循环反复直到达到分组长度所形成的比特序列。

X0R 运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里我们将这个比特序列称为 opadkey。

(6)与散列值组合
将(4)的散列值拼在 opadkey 后面。

(7)计算散列值
将(6)的结果输又单向散列函数,并计算出散列值。这个散列值就是最终的 MAC 值。

通过上述流程我们可以看出,最后得到的 MAC 值,一定是一个和输人的消息以及密钥都相关的长度固定的比特序列。

哈希算法选择

  • SHA-256: 广泛使用的安全哈希算法,输出长度为256位(32字节),在安全性和性能之间取得良好平衡,适用于大多数现代应用。
  • SHA-512: 输出长度为512位(64字节),适用于需要高安全性的场景,计算速度相对较慢。
  • SHA-1: 已被认为不够安全,不推荐用于新系统,输出长度为160位(20字节),仅用于兼容旧系统。
  • MD5: 最不安全的选项,容易受到碰撞攻击,输出长度为128位(16字节),计算速度快,但不应用于安全相关用途,仅用于非加密目的,如校验和。

密钥(偏移)

  • Text: 表示是文本格式,加密前会使用 UTF-8 编码,把它转成 byte[] 数组
  • Hex 表示是十六进制格式,加密前会把十六进制字符串转成 byte[] 数组
+