【后端】HMAC签名

  • 定义
    HMAC(Hash-based Message Authentication Code)是一种基于哈希函数和密钥的消息认证机制,用于验证数据的完整性和来源身份。广泛应用于 API 请求签名、数据传输校验、身份认证等场景,是现代安全通信的核心技术之一
  • 核心概念
    输入:消息内容 + 密钥
    处理:通过哈希函数(如 SHA-256)进行两轮加密计算
    输出:一个固定长度的签名值(哈希值)
    只有拥有密钥的一方才能生成或验证这个签名,从而确保数据没有被篡改,也确实来自可信方。
    通常情况下,这些 X-Ca- 开头的请求头(包括 HMAC 签名)是由浏览器端 JavaScript 动态生成的,而不是后端直接传过来的。
    在某些平台(比如阿里云、AWS)中,签名是由后端生成并返回给前端使用。
  • 计算公式
    HMAC(K, M) = H((K ⊕ opad) || H((K ⊕ ipad) || M))
    K:密钥
    M:消息
    H:哈希函数(如 SHA-256)
    ⊕:异或操作
    opad / ipad:外部 / 内部填充常量
    这两轮哈希计算增强了安全性,防止长度扩展攻击等常见漏洞。
  • 应用场景
    API 请求签名 防止请求被篡改或伪造
    数据完整性校验 确保文件或消息未被修改
    身份认证 验证请求是否来自合法用户
    防重放攻击 结合时间戳和随机数,防止旧请求被重复利用
  • 举个例子
js 复制代码
import crypto from 'crypto';

function generateHMAC(message, secret) {
  return crypto.createHmac('sha256', secret).update(message).digest('base64');
}

const signature = generateHMAC('GET /api/data?page=1', 'your_secret_key');
//如果将'your_secret_key和page进行关联,则只允许每一页对应一个,如果不对应则拒绝响应
//如果使用相同的消息(message)和相同的密钥(secret)则 HMAC结果是完全一致的,每次计算都会得到相同的签名值
console.log('HMAC-SHA256 签名:', signature);