You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir中如何对HMAC编码结果进行解码或验证?

HMAC验证逻辑与常见误区说明

嘿,刚好对Elixir里的HMAC操作门儿清,我来给你理清楚解码和验证的事儿——先得纠正一个关键认知:HMAC是单向哈希认证机制,你没法从生成的编码值反推出原始消息内容,所以所谓的"解码"其实是个误区,咱们重点说验证的正确姿势:

一、如何验证HMAC签名

验证的核心逻辑就是「用相同的密钥、相同的哈希算法,重新计算一次HMAC,再和收到的结果比对」。如果两者一致,就说明消息没被篡改,且使用的密钥是对的。

针对你给出的Elixir代码,具体验证步骤如下:

  1. 把收到的Base16编码HMAC值解码成二进制(因为Base.encode16是把二进制转成十六进制字符串,所以反向操作就是解码)
  2. 用相同的密钥和SHA256算法,对原始消息重新计算HMAC的二进制值
  3. 直接比对两个二进制值是否相等(别比对字符串,避免大小写或编码格式的坑)

Elixir代码示例

假设你已经拿到了需要验证的十六进制HMAC字符串,代码如下:

# 原始的密钥和消息
key = "key444"
original_msg = "The quick brown fox jumps over the lazy dog"
# 这是你之前生成的HMAC十六进制结果
received_hmac_hex = "F7BC83F430538424B13298E6AA6FB143EF4D59A14946175997479DBC2D1A3CD8"

# 1. 解码收到的十六进制HMAC为二进制
received_hmac = Base.decode16!(received_hmac_hex, case: :mixed)

# 2. 重新计算原始消息的HMAC
calculated_hmac = :crypto.hmac(:sha256, key, original_msg)

# 3. 比对验证
if calculated_hmac == received_hmac do
  IO.puts("✅ 验证通过:消息完整,密钥正确")
else
  IO.puts("❌ 验证失败:消息被篡改或密钥错误")
end

二、关于"解码"的误区

再敲一遍黑板:HMAC不是加密算法,它是哈希认证工具——它的作用是确认数据的真实性和完整性,而不是加密存储数据。所以你完全没法从HMAC值反推出原始的"The quick brown fox..."这段内容。

如果你的需求是要能还原原始数据,那你应该用对称加密算法(比如AES),而不是HMAC哦。

内容的提问来源于stack exchange,提问作者petspanda D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:46:32