HMAC 签名算法详解

发布时间:2026/10/16 15:36:57

HMAC 签名算法详解 一、什么是 HMACHMACHash-based Message Authentication Code基于哈希的消息认证码是一种结合密码学哈希函数与对称密钥来生成消息认证码的算法。它同时继承了哈希函数的高效计算特性与对称密钥的认证能力核心作用是验证消息的完整性与真实性—— 确保消息在传输过程中未被篡改且确实来自持有密钥的合法发送方。HMAC 由 Mihir Bellare、Ran Canetti 和 Hugo Krawczyk 于 1996 年提出1997 年被纳入 RFC 2104 国际标准是目前工业界应用最广泛的消息认证码方案。它不绑定特定哈希函数可灵活搭配 MD5、SHA-1、SHA-256、SHA-512 等任意哈希算法对应记作 HMAC-MD5、HMAC-SHA256、HMAC-SHA512 等。二、核心设计思想很多人会将 HMAC 简单理解为 “密钥 消息拼接后做哈希”即Hash(key message)。这种朴素实现存在严重的安全缺陷最典型的就是长度扩展攻击攻击者在不知道原始密钥的情况下可以在消息末尾追加任意数据直接推导出合法的哈希值从而伪造签名。HMAC 的设计目标就是从结构上规避这类攻击它采用双层哈希 两次密钥异或的嵌套结构不直接拼接密钥与消息而是将密钥分别与两个固定常量ipad、opad做异或运算生成两组相互独立的派生密钥先将内层派生密钥与原始消息拼接执行第一次哈希运算再将外层派生密钥与第一次哈希的结果拼接执行第二次哈希运算最终输出 HMAC 值。这种 “内哈希 外哈希” 的嵌套结构从根本上阻断了长度扩展攻击的路径同时几乎没有损失哈希函数的计算效率。三、标准计算流程3.1 前置定义设H为所选底层哈希函数如 SHA-256K为原始签名密钥B为哈希函数的分组长度单位字节例如 SHA-256 分组长度为 64 字节SHA-512 为 128 字节L为哈希函数的输出长度单位字节例如 SHA-256 输出 32 字节ipad 0x36 重复 B 次内层填充常量opad 0x5C 重复 B 次外层填充常量text为待签名的原始消息3.2 密钥预处理密钥长度必须对齐哈希函数的分组长度因此需要先做标准化处理若密钥长度大于分组长度 B先对密钥执行一次哈希将哈希结果作为新密钥长度变为 L若密钥长度小于分组长度 B在密钥末尾补 0将其填充至 B 字节长度。最终得到长度恰好为 B 字节的标准化密钥K0。3.3 完整计算步骤计算内层派生密钥K_inner K0 XOR ipad将内层派生密钥与原始消息拼接得到内层输入K_inner || text对内层输入执行哈希运算得到内层摘要inner_hash H(K_inner || text)计算外层派生密钥K_outer K0 XOR opad将外层派生密钥与内层摘要拼接得到外层输入K_outer || inner_hash对外层输入执行哈希运算最终结果即为 HMAC 值\(\text{HMAC}(K, \text{text}) H\left( (K_0 \oplus \text{opad}) \parallel H\left( (K_0 \oplus \text{ipad}) \parallel \text{text} \right) \right)\)3.4 常量 0x36 与 0x5C 的设计依据这两个数值并非随机选取0x36 的二进制为001101100x5C 为01011100二者汉明距离大每一位差异尽可能多异或后能让密钥的比特位充分扩散降低内外层派生密钥的相关性提升整体安全性。四、安全特性分析4.1 核心安全优势天然抵抗长度扩展攻击这是 HMAC 最核心的安全价值。由于外层哈希完整包裹了内层哈希的输出攻击者无法通过追加消息的方式推导合法签名这也是它优于Hash(keymessage)朴素实现的根本原因。哈希碰撞影响有限即使底层哈希函数出现碰撞漏洞如 MD5、SHA-1HMAC 的安全性下降幅度也远小于裸哈希。例如 HMAC-MD5 至今仍未被完全攻破其安全强度显著高于单独使用 MD5。密钥不直接暴露密钥始终以异或后的派生形态参与运算不会直接出现在哈希输入的首尾降低了密钥侧信道泄露的风险。对称认证性只有持有相同密钥的双方才能生成和验证签名可确认消息来源的真实性。4.2 安全边界与注意事项HMAC 属于对称算法不具备不可否认性收发双方都可以生成签名无法替代数字签名密钥长度建议至少等于哈希输出长度过短的密钥会大幅降低暴力破解的成本不建议继续使用 HMAC-MD5、HMAC-SHA1生产环境优先选择 HMAC-SHA256 及以上强度的组合。五、典型应用场景5.1 API 接口鉴权开放平台与服务端通信中客户端将请求参数按规则排序拼接后用密钥生成 HMAC 签名服务端收到请求后按相同规则重新计算签名并比对。该方案可有效防止参数被篡改配合时间戳与随机数还能防御重放攻击是 AWS、阿里云、微信支付等绝大多数开放平台的标准鉴权方案。5.2 JWT 令牌签名JSON Web Token 中的 HS256、HS384、HS512 算法本质就是 HMAC-SHA256、HMAC-SHA384、HMAC-SHA512。服务端用密钥对 Payload 签名客户端无法篡改令牌内容服务端校验通过即可信任身份信息。5.3 文件完整性校验在分发安装包、固件等文件时发布方同时公布文件的 HMAC 值与共享密钥下载方计算本地文件的 HMAC 并比对可确认文件未被植入恶意代码。相比普通哈希校验HMAC 还能防止攻击者同时篡改文件和哈希校验值。5.4 密码存储不推荐HMAC 有时被用来哈希存储用户密码但它并非为慢哈希设计计算速度过快容易被彩虹表和暴力破解攻击。存储用户密码应优先使用 bcrypt、Argon2、PBKDF2 等专用慢哈希算法。六、代码实现示例6.1 PythonPython 标准库hmac提供了原生实现import hmac import hashlib key byour_secret_key message bHello, HMAC! # 生成 HMAC-SHA256 签名 signature hmac.new(key, message, digestmodhashlib.sha256).hexdigest() print(signature)6.2 GoGo 语言crypto/hmac标准库package main import ( crypto/hmac crypto/sha256 encoding/hex fmt ) func main() { key : []byte(your_secret_key) message : []byte(Hello, HMAC!) h : hmac.New(sha256.New, key) h.Write(message) signature : hex.EncodeToString(h.Sum(nil)) fmt.Println(signature) }6.3 Node.jsconst crypto require(crypto); const key your_secret_key; const message Hello, HMAC!; const signature crypto.createHmac(sha256, key) .update(message) .digest(hex); console.log(signature);七、总结HMAC 是密码学工程中极其经典且实用的基础组件它以极低的实现成本解决了网络通信中最常见的 “消息篡改” 与 “身份伪造” 问题。其双层哈希的设计思想简洁而精妙历经数十年工业界实战检验依然稳固。在工程实践中只要涉及对称密钥下的消息认证、接口签名、令牌校验HMAC-SHA256 都是默认的安全选型。理解其原理不仅能帮助开发者正确使用它也能避免因自行封装错误如实现hash(keymsg)朴素方案而引入安全漏洞。
延伸阅读

更多相关文章

2026/10/15 20:25:05

基于TVA的具身智能因果感知与反事实想象能力

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的系统级视觉技术框架。它融合深度强化学习(DRL)、卷积神…

2026/10/12 7:02:05

SpringBoot+Vue全栈实习生管理系统开发实践

1. 项目概述与核心价值实习生管理系统作为现代企业人力资源数字化转型的重要组成部分,正在从传统的Excel表格管理向智能化平台快速演进。这个基于SpringBootVue的全栈解决方案,完美融合了后端业务处理的高效性与前端交互的流畅体验。我在参与某跨国科技公…

2026/10/16 7:42:15

层次分析法(AHP)实战指南:从数学建模到决策优化

1. 项目概述:从“拍脑袋”到“算清楚”的决策利器在数学建模竞赛,尤其是像“美赛”、“国赛”这类开放性极强的比赛中,我们常常会遇到一类让人头疼的问题:方案选优。比如,要评选最佳旅游城市,需要考虑景色、…

2026/10/16 15:32:08

ArcGIS mxd工程包管理:图层规范、数据源校验与ArcPy批处理实践

简介:ArcGIS地图数据压缩包面向GIS开发者和地理信息学习者,汇集城市级、洲级与世界级三套多尺度地图图层,并配套Esri标准的.msd地图文档,可广泛服务于地图制作、空间分析、数据管理与二次开发等场景。包内共有24个文件&#xff0c…

2026/10/16 15:32:08

单阶段实例分割新思路:EmbedMask的嵌入耦合机制解析

直接说结论:如果你觉得“单阶段实例分割”就是 YOLACT、SOLO 那一类方法的天下,那么 EmbedMask 值得你再花半小时重新理解一遍。它没有把实例分割变成一个完全检测驱动的任务,也没有回到两阶段那种“先框后分割”的串联老路,而是把…

2026/10/16 15:32:08

Codesys与AM600面向对象编程:动作、方法、属性实战解析

简介:面向Codesys汇川AM600平台的面向对象编程PDF资料,适合工业自动化工程师与PLC进阶学习者。资源聚焦IEC 61131-3标准下的OOP实现,系统讲解对象、类、属性、方法及动作(Action)的概念,并结合汇川AM600环境…

2026/10/16 15:32:08

目标检测评估避坑指南:FPPI曲线与DET曲线正确绘制方法

简介:实现 miss rate versus false positives per image(FPPI)曲线绘制的完整代码包,适用于目标检测与行人检测任务中的算法评估、论文复现及实验对比。基于提供的 Matlab 脚本和示例数据,可快速生成标准 FPPI 曲线&am…

2026/10/16 15:27:07

MATLAB全景拼接实战:从块匹配到深度学习增强的完整实现

简介:基于MATLAB的计算机视觉与深度学习实战代码,聚焦块匹配全景图像拼接,适合课程学习、毕业设计或算法验证。代码按灰度与RGB两条流程组织,包含图像读取、块匹配、几何变换估计与图像融合等模块,并提供GUI界面便于交…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑