深入解析HMAC:消息认证码的核心原理

好的!我们来对HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)进行一次全面、深入且结构清晰的详解。

HMAC 是现代密码学和网络安全中确保数据完整性与身份认证的核心工具。它不是用来加密数据的,而是用来回答两个关键问题:

  1. 数据在传输或存储过程中被篡改了吗?(完整性)
  2. 这条消息真的是来自我所信任的那方吗?(身份认证)

一、核心思想与设计目标

  • 基本概念:HMAC 是一种带密钥的哈希函数。它需要两个输入:待验证的消息M和一个双方共享的秘密密钥K
  • 输出:一个固定长度的、看似随机的比特串,称为MAC 值HMAC 标签
  • 设计目标(RFC 2104):
    1. 可重用现有哈希函数:能与任何迭代式密码学哈希函数(如 MD5, SHA-1, SHA-256)结合使用。
    2. 保留哈希函数的性能:计算效率高。
    3. 易于分析安全性:其安全性可以规约到所用哈希函数的安全性上。
    4. 密钥处理灵活:能处理任意长度的密钥。

二、HMAC 的数学定义与构造原理

HMAC 的构造非常巧妙,采用了双重嵌套哈希双重异或的结构,以抵御各种攻击(特别是长度扩展攻击)。

数学公式
HMAC(K, M) = H( (K' ⊕ opad) || H( (K' ⊕ ipad) || M ) )

其中:

  • H:底层的密码学哈希函数(如 SHA-256)。
  • K:原始密钥。
  • M:待认证的消息。
  • ||:表示拼接(Concatenation)。
  • :表示按位异或(XOR)。
  • opad(outer padding):0x5C重复B次。
  • ipad(inner padding):0x36重复B次。
  • B:哈希函数H分组长度(Block Size)(例如,SHA-256 的B = 64字节)。
  • K':经过预处理后的密钥。
密钥预处理(Key Pre-processing)

原始密钥K需要被处理成一个固定长度B的密钥K'

  1. 如果len(K) > B
    • 先用哈希函数HK进行压缩:K = H(K)
    • 此时K的长度变为L(哈希函数的输出长度,如 SHA-256 的L = 32)。
  2. 如果len(K) < B
    • K末尾填充0x00字节,直到其长度达到B
  3. 最终结果:得到一个长度恰好为B字节的K'

注意:即使第一步压缩后K的长度L小于B,也需要进行第二步的补零操作。


三、HMAC 的计算步骤(图文解析)

假设我们使用H = SHA-256B = 64

  1. 准备填充值:

    • ipad = 0x363636...36(64 个0x36字节)
    • opad = 0x5C5C5C...5C(64 个0x5C字节)
  2. 密钥预处理:

    • 得到K'(长度为 64 字节)。
  3. 计算内层哈希(Inner Hash):

    • K'ipad进行异或:K' ⊕ ipad
    • 将结果与消息M拼接:(K' ⊕ ipad) || M
    • 对拼接后的数据计算哈希:inner_hash = H( (K' ⊕ ipad) || M )
  4. 计算外层哈希(Outer Hash / Final MAC):

    • K'opad进行异或:K' ⊕ opad
    • 将结果与inner_hash拼接:(K' ⊕ opad) || inner_hash
    • 对拼接后的数据计算哈希:HMAC = H( (K' ⊕ opad) || inner_hash )

这个最终的HMAC值就是我们要的认证标签。


四、为什么 HMAC 是安全的?

  1. 抵御长度扩展攻击:

    • 传统的“H(key || message)”模式容易受到长度扩展攻击。攻击者即使不知道key,也可以在已知H(key || message)的情况下,计算出H(key || message || padding || extension)
    • HMAC 的双重嵌套结构完美地解决了这个问题。外层的H( (K' ⊕ opad) || ... )将内层哈希的结果作为“消息”的一部分,而这个“消息”的开头是(K' ⊕ opad),攻击者无法伪造。
  2. 密钥隔离:

    • 内层 (ipad) 和外层 (opad) 使用了不同的常量进行异或,这相当于为内层和外层哈希创建了两个独立的、由密钥派生的“虚拟哈希函数”。这增加了攻击的难度。
  3. 安全性证明:

    • 在理想条件下(即底层哈希函数H是一个随机预言机),HMAC 的安全性可以被严格证明。这意味着,只要H是安全的,HMAC 就是安全的。

五、典型应用场景

  1. API 请求签名:

    • 客户端和服务器共享一个secret_key
    • 客户端在发送请求前,用secret_key对请求体(或特定请求头)计算 HMAC,并将结果放在X-Signature头中。
    • 服务器收到请求后,用同样的secret_key和算法重新计算 HMAC,并与客户端提供的签名比对。一致则放行。
  2. 文件/软件包完整性校验:

    • 软件发布者在发布文件的同时,会发布该文件的 HMAC 值(使用只有他们知道的私钥计算)。
    • 用户下载文件后,用相同的密钥计算 HMAC,如果与官方发布的值一致,则证明文件未被篡改。
  3. 一次性密码(OTP):

    • TOTP(Time-based OTP)HOTP(HMAC-based OTP)的核心就是HMAC-SHA1(secret, counter_or_time)。你的 Google Authenticator 或银行令牌就是基于此原理。
  4. TLS/SSL 协议:

    • 在较老的 TLS 版本(如 TLS 1.2)中,HMAC 被用于计算记录层数据的 MAC,以确保传输数据的完整性。在现代 AEAD 模式(如 AES-GCM)中,HMAC 的角色已被内置的认证机制取代。

六、安全实践建议

  1. 选择安全的哈希函数:

    • 绝对不要使用 HMAC-MD5 或 HMAC-SHA1。
    • 首选 HMAC-SHA256。它是目前最主流、最推荐的选择。
    • 对于极高安全要求的场景,可考虑 HMAC-SHA384 或 HMAC-SHA512。
  2. 密钥管理:

    • 密钥必须保密,且只在通信双方之间共享。
    • 密钥长度应至少等于哈希函数的输出长度(如 SHA-256 输出 256 位,密钥也应 ≥ 256 位)。过短的密钥会成为安全瓶颈。
  3. 防时序攻击(Timing Attack):

    • 在比较接收到的 MAC 和自己计算的 MAC 时,绝不能使用简单的==操作符。因为==会在第一个不匹配的字节就返回false,攻击者可以通过测量响应时间来逐字节猜解正确的 MAC。
    • 必须使用恒定时间比较函数,例如 Python 的hmac.compare_digest(a, b),或自己实现一个逐字节比较并累积结果的函数。

七、总结

HMAC 通过其精巧的双重哈希和异或结构,成功地将一个普通的哈希函数升级为一个强大的、带密钥的消息认证工具。它简单、高效、安全,并且得到了广泛的标准支持(RFC 2104)。从你每天使用的网站 API 到手机上的双因素认证,HMAC 都在幕后默默守护着数据的真实性和完整性,是现代密码学不可或缺的基石之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1125510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iir滤波器的理论分析与matlab仿真,对比butter/cheby1/cheby2/ellip/yulewalk

目录 1.butter函数,巴特沃斯滤波器 2. cheby1函数&#xff0c;切比雪夫I型滤波器 3. cheby2函数&#xff0c;切比雪夫II型滤波器 4.ellip函数&#xff0c;椭圆滤波器 5.yulewalk函数&#xff0c;Yule-Walker滤波器 6.各函数对比分析 IIR滤波器即无限长单位冲激响应滤波器…

java进阶--多线程学习

java进阶–多线程学习 java进阶–多线程学习&#xff08;1&#xff09; java进阶–多线程学习&#xff08;1&#xff09; 1.并行与并发的概念 并发是指一个处理器同时处理多个任务。 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 并发是逻辑上的同时发生&…

Java进阶教程(一)关键字

Java进阶教程&#xff08;一&#xff09; 关键字 synchronized&#xff1a;当它用来修饰一个方法或者一个代码块的时候&#xff0c;能够保证在同一时刻最多只有一个线程执行该段代码。 instanceof&#xff1a;在运行时指出对象是否是特定类的一个实例。 result object instanc…

AI(人工智能)是模拟人类智能行为的技术,如学习、推理、识别

AI&#xff08;人工智能&#xff09;是模拟人类智能行为的技术&#xff0c;如学习、推理、识别等。大模型通常指参数量巨大的深度学习模型&#xff08;如GPT、BERT&#xff09;&#xff0c;依赖海量数据和算力进行训练&#xff0c;在自然语言处理、图像生成等领域表现卓越。前端…

C++内存序

在 C 中&#xff0c;内存序&#xff08;Memory Order&#xff09;是多线程编程中原子操作的重要概念&#xff0c;它用于控制原子操作的内存同步行为。C11 引入了 <atomic> 头文件&#xff0c;提供了内存序来控制多线程环境下的内存访问顺序。内存序的作用内存序主要解决两…

【课程设计/毕业设计】基于机器学习python深度学习的道路坑洼识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

FPGA应用开发和仿真【3.3】

7.1.4 离散量化信号的信噪比 不失一般性,考虑一个幅度为1、频率为1的正弦信号a(t)=sin(2πt),经过采样周期Ts的采样离散化之后,如果被DAC以零阶保持特性输出,将得到信号: 如果还经过分辨力δ的量化,取最接近的量化阶梯,将得到信号: 其中 符号表示取最接近自变量的…

linux redis简单操作

linux redis简单操作 1、centOS 系统安装redis https://blog.csdn.net/weixin_42835409/article/details/119562074 2、安装完成后终端输入redis-cli 报 redis-cli -bash: redis-cli: command not found 问题解决 进入到redis文件下src/bin目录下 将redis-cli 复制到 /usr/loc…

要实现应用的高弹性、可扩展性与快速迭代,可以结合现代云原生技术栈,包括容器化(如Docker)、Kubernetes编排、微服务架构

要实现应用的高弹性、可扩展性与快速迭代&#xff0c;可以结合现代云原生技术栈&#xff0c;包括容器化&#xff08;如Docker&#xff09;、Kubernetes编排、微服务架构、服务网格&#xff08;如Istio&#xff09;以及CI/CD流水线。以下是整体架构设计与关键实践&#xff1a;容…

Java进阶文件输入输出实操(图片拷贝)

Java进阶文件输入输出实操&#xff08;图片拷贝&#xff09;把某个目录下的全部图片&#xff0c;全部拷贝到另外一个目录 package test; import domee.chapter6_7.B; import java.io.*; public class Ex10_10 { public static void main(String[] args) throws IOException { S…

深度测评8个一键生成论文工具,专科生毕业论文轻松搞定!

深度测评8个一键生成论文工具&#xff0c;专科生毕业论文轻松搞定&#xff01; AI 工具如何助力论文写作&#xff1f; 在当今学术环境中&#xff0c;越来越多的专科生开始借助 AI 工具来提升论文写作效率。这些工具不仅能够快速生成初稿&#xff0c;还能有效降低 AIGC&#xff…

爆火!7款AI写论文神器,20分钟生成2.5万字问卷类论文,真实参考文献!

深夜急救&#xff01;论文Deadline倒计时3天&#xff1f;这7款AI工具能救你 凌晨2点&#xff0c;电脑屏幕上的论文文档还是空白页——导师催稿的消息弹了出来&#xff0c;问卷数据还没整理&#xff0c;参考文献格式一团糟&#xff0c;查重率更是飙到40%以上……如果你正在经历…

深度测评2026最新!9款AI论文软件评测:本科生毕业论文全场景推荐

深度测评2026最新&#xff01;9款AI论文软件评测&#xff1a;本科生毕业论文全场景推荐 2026年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;AI论文辅助工具在学术领域的应用日益广泛。对于本科生而言&#xff0c;撰写毕业论文不…

在软件开发中,熟练掌握一些常用工具如 Git、Docker 和 IDE 可以极大提升开发效率和协作质量

在软件开发中&#xff0c;熟练掌握一些常用工具如 Git、Docker 和 IDE 可以极大提升开发效率和协作质量。以下是这些工具的实用使用技巧&#xff1a; Git 使用技巧 合理使用分支管理 使用 git feature/xxx 命名功能分支&#xff0c;hotfix/xxx 修复紧急问题。推荐使用 Git Flow…

在磁盘调度中,当进程请求读写磁盘时,操作系统需依次进行移臂调度和旋转调度,以高效定位数据所在的物理位置

一、磁盘调度部分 在磁盘调度中&#xff0c;当进程请求读写磁盘时&#xff0c;操作系统需依次进行移臂调度和旋转调度&#xff0c;以高效定位数据所在的物理位置。移臂调度&#xff08;最短寻道时间优先&#xff0c;SSTF&#xff09; 当前磁头位于 18 号柱面。根据最短寻道时间…

什么是Leader AP

文章目录为什么需要Leader APLeader AP是如何工作的Leader AP有哪些组网方式哪些Wi-Fi设备支持Leader APLeader AP是FAT AP的一个扩展功能&#xff0c;是指FAT AP能够像WAC一样&#xff0c;可以和多个FIT AP一起组建WLAN&#xff0c;由FAT AP统一管理和配置FIT AP&#xff0c;为…

【课程设计/毕业设计】基于python机器学习的苹果和西红柿识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

React Native本地通知与JNI

React Native本地通知与JNI&#xff1a;跨平台原生能力集成深度解析 关键词&#xff1a;React Native、本地通知、JNI、Android原生开发、iOS原生模块、跨平台桥接、移动应用开发 摘要&#xff1a;本文深入探讨在React Native中实现本地通知功能的核心技术&#xff0c;重点解析…

在 Ubuntu 18.04 (WSL) 上配置 LazyVim

在 Ubuntu 18.04 (WSL) 上配置 LazyVim 的终极指南&#xff1a;解决 GLIBC 和 Tree-sitter 依赖难题 前言 在 Ubuntu 18.04 这种“古董”系统上安装现代化的 Neovim 配置&#xff08;如 LazyVim&#xff09;是一场噩梦。 LazyVim 要求 Neovim > 0.10&#xff0c;而 Ubuntu 1…

【超全解析】前端如何优雅地判断是否为移动端?从 UA 检测到现代解决方案

【超全解析】前端如何优雅地判断是否为移动端&#xff1f;从 UA 检测到现代解决方案 在前端开发中&#xff0c;「判断当前访问设备是否为移动端」几乎是一个绕不开的问题。 无论是 响应式布局、条件渲染、跳转 H5 / PC 站点、性能优化&#xff0c;还是 埋点分析&#xff0c;都可…