当前位置: 首页 > news >正文

签名、杂凑、MAC、HMAC

在数据保密性与完整性领域,签名(Digital Signature,数字签名)杂凑(Hash,哈希)MAC(Message Authentication Code,消息认证码)HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码) 是保障数据完整性、真实性的核心技术,其定义、核心思想、实现逻辑及关键特性存在明确差异,以下从客观角度详细拆解:

一、杂凑(Hash,哈希)

1. 定义

杂凑(哈希)是一种单向密码学函数,能将任意长度的输入数据(称为 “消息” 或 “明文”)映射为固定长度的输出值(称为 “哈希值”“摘要” 或 “指纹”),且输出长度仅由哈希算法本身决定(与输入长度无关)。

2. 核心思想

通过 “单向性” 和 “抗碰撞性” 确保数据完整性:

  • 单向性:从哈希值无法反推回原始输入数据(即 “不可逆”);
  • 抗碰撞性:① 弱抗碰撞性 —— 难以找到两个不同输入对应相同哈希值;② 强抗碰撞性 —— 无法主动构造出两个不同输入对应相同哈希值。
    最终实现 “数据一旦被篡改,其哈希值必然变化”,从而通过比对哈希值验证数据是否被修改。
3. 实现逻辑
  1. 预处理:对输入数据进行填充(如补零、添加长度信息),确保数据长度符合算法要求的分组长度整数倍(如 SHA-256 要求分组长度为 512 位);
  2. 迭代压缩:将预处理后的数据按固定分组长度拆分,逐组代入哈希算法的压缩函数(如 SHA-256 的 64 轮压缩),每一轮通过逻辑运算(与、或、非、异或、循环移位等)更新中间哈希值;
  3. 输出结果:所有分组处理完成后,最终的中间哈希值即为固定长度的哈希值(如 SHA-256 输出 256 位,SHA-384 输出 384 位)。
4. 关键特性与适用场景
  • 无密钥:计算哈希值无需依赖密钥,任何人都可对同一数据计算出相同哈希值;
  • 仅保障完整性:无法验证数据来源的真实性(因无密钥,篡改者可重新计算篡改后数据的哈希值);
  • 典型算法:SHA-2 系列(SHA-256、SHA-384)、SHA-3 系列、MD5(已因抗碰撞性不足,不再用于安全场景);
  • 适用场景:文件完整性校验(如软件安装包校验)、数据去重、密码存储(将用户密码的哈希值存储,而非明文)。

二、MAC(Message Authentication Code,消息认证码)

1. 定义

MAC 是一种带密钥的完整性与真实性验证技术,通过 “消息 + 共享密钥” 生成固定长度的认证码,仅持有共享密钥的双方可验证认证码,从而同时确保数据 “未被篡改”(完整性)和 “来源合法”(真实性)。

2. 核心思想

在哈希的 “完整性验证” 基础上,引入 “共享密钥” 实现 “仅授权方(持有密钥)可生成 / 验证认证码”:

  • 发送方:用共享密钥对消息计算 MAC,将 “消息 + MAC” 一起发送;
  • 接收方:用相同共享密钥对收到的消息重新计算 MAC,若与收到的 MAC 一致,则确认消息未篡改且来源合法(非持有密钥者无法伪造 MAC)。
3. 实现逻辑

MAC 的实现依赖 “密钥 + 核心函数”,主要分为两类:

  1. 基于分组密码的 MAC(如 CBC-MAC)
    • 步骤 1:将消息按分组密码(如 AES)的分组长度拆分,不足分组长度则填充;
    • 步骤 2:用共享密钥对第一组消息进行分组密码加密,得到中间结果;
    • 步骤 3:将中间结果与下一组消息进行 “异或” 运算,再用共享密钥加密,重复此过程直至所有分组处理完成;
    • 步骤 4:最终一组的加密结果即为 MAC(通常会截取固定长度,如 128 位)。
  1. 基于哈希的 MAC(即 HMAC,单独拆解)
    • 本质是将哈希函数与共享密钥结合,解决单纯哈希无密钥的问题。
4. 关键特性与适用场景
  • 需共享密钥:依赖发送方与接收方预先协商的对称密钥(非对称密钥不适用);
  • 双向验证:发送方和接收方持有同一密钥,无法区分 “发送方身份”(即无法解决 “抵赖” 问题 —— 发送方可否认发送过消息);
  • 典型算法:CBC-MAC(基于 AES)、CMAC(CBC-MAC 的改进版,避免弱密钥问题)、HMAC;
  • 适用场景:对称加密场景下的完整性 + 真实性验证(如 API 接口签名、本地网络数据传输验证)。

三、HMAC(Hash-based Message Authentication Code,基于哈希的消息认证码)

1. 定义

HMAC 是MAC 的一个具体实现类别,特指 “以哈希函数为核心,结合共享密钥生成认证码” 的技术,本质是 “哈希函数 + 密钥” 的组合,同时具备哈希的高效性和 MAC 的密钥验证能力。

2. 核心思想

解决 “单纯哈希无密钥” 和 “基于分组密码的 MAC 效率低” 的问题:

  • 利用哈希函数的高效性(比分组密码加密更快),同时通过密钥注入,让哈希值与密钥绑定 —— 仅持有密钥者可生成正确的 HMAC,既保障完整性,又验证来源真实性。
3. 实现逻辑(严格遵循 RFC 2104 标准)

设:H为哈希函数(如 SHA-256),K为共享密钥,M为消息,ipad(0x36 重复填充至哈希分组长度)、opad(0x5C 重复填充至哈希分组长度)为固定常量,具体步骤:

  1. 密钥预处理:若K长度大于H的分组长度,先对K计算哈希值,得到与分组长度一致的密钥K';若K长度小于分组长度,直接用 0 填充至分组长度,得到K'
  2. 计算内层哈希:将K'ipad进行 “异或” 运算,得到K'^ipad;将M拼接在K'^ipad后,计算哈希值H(K'^ipad || M)
  3. 计算外层哈希:将K'opad进行 “异或” 运算,得到K'^opad;将内层哈希结果拼接在K'^opad后,计算哈希值H(K'^opad || H(K'^ipad || M))
  4. 输出 HMAC:最终的外层哈希结果即为 HMAC 值(长度与H的输出长度一致,如 SHA-256 对应 HMAC 长度为 256 位)。
4. 关键特性与适用场景
  • 依赖哈希函数:哈希函数的安全性直接决定 HMAC 的安全性(如用 SHA-256 的 HMAC 比用 MD5 的 HMAC 更安全);
  • 对称密钥:与 MAC 一致,需发送方和接收方共享对称密钥;
  • 高效性:比基于分组密码的 MAC(如 CBC-MAC)计算速度更快,适合大数据量场景;
  • 典型算法:HMAC-SHA256、HMAC-SHA384、HMAC-SHA1(SHA1 安全性下降,逐步被替代);
  • 适用场景:互联网场景的高效验证(如 HTTP 接口签名、JWT 的 HS256 算法、SSL/TLS 握手阶段的完整性验证)。

四、签名(Digital Signature,数字签名)

1. 定义

数字签名是一种基于非对称密码学的身份认证与完整性技术,通过 “私钥签名、公钥验证” 实现:仅持有私钥者可生成签名,任何人可通过公钥验证签名,从而同时保障数据的 “完整性”“真实性” 和 “不可抵赖性”。

2. 核心思想

利用非对称密码学的 “私钥唯一持有、公钥公开可查” 特性,解决 MAC 的 “无法抗抵赖” 问题:

  • 签名方(如用户 A)用自己的私钥对消息(或消息的哈希值)生成签名;
  • 验证方(如用户 B)用签名方的公钥对 “消息 + 签名” 进行验证,若验证通过,则确认:① 消息未被篡改(完整性);② 签名确为由私钥持有者生成(真实性);③ 签名方无法否认签名行为(不可抵赖性)。
3. 实现逻辑(主流为 “哈希 + 非对称加密” 组合,因直接加密消息效率低)

设:SK为签名方的私钥,PK为对应的公钥,H为哈希函数,M为消息,具体步骤:

  1. 消息哈希:对原始消息M计算哈希值H(M)(压缩消息长度,提高加密效率,同时保障完整性);
  2. 私钥签名:用签名方的私钥SK对哈希值H(M)进行 “非对称加密”(或特定的签名算法运算,如 RSA 的签名是对H(M)进行私钥解密,本质是特殊的非对称运算),得到签名s
  3. 发送数据:将 “原始消息M+ 签名s” 一起发送给验证方;
  4. 公钥验证
    • 验证方先用相同的哈希函数计算M的哈希值H'(M)
    • 再用签名方的公钥PK对签名s进行 “非对称解密”(或对应验证运算),得到H''(M)
    • H'(M) = H''(M),则签名验证通过;否则验证失败(消息被篡改或签名伪造)。
4. 关键特性与适用场景
  • 非对称密钥:私钥唯一(签名方持有,需严格保密),公钥公开(可通过证书链验证合法性,避免公钥被篡改);
  • 抗抵赖性:核心区别于 MAC—— 因私钥唯一,签名方无法否认签名行为(可作为法律证据);
  • 典型算法:RSA-SHA256(RSA 签名 + SHA256 哈希)、ECDSA-SHA256(椭圆曲线签名 + SHA256,效率高于 RSA)、EdDSA(如 Ed25519,更高效、安全的椭圆曲线签名算法);
  • 适用场景:需身份认证与抗抵赖的场景(如电子合同签名、软件发布签名、区块链交易签名、数字证书 issuance)。

五、其他类似概念

除上述四类核心技术外,数据完整性与真实性领域还有以下常用概念:

概念

定义与核心思想

与前述技术的区别

CMAC(Cipher-based MAC)

基于分组密码的 MAC 改进版,解决 CBC-MAC 的 “弱密钥” 和 “相同密钥下不同长度消息的碰撞” 问题,通过引入 “子密钥” 增强安全性。

属于 MAC 的子类,比传统 CBC-MAC 更安全,适用于对分组密码依赖度高的场景(如硬件加密设备),区别于 HMAC 的 “基于哈希”。

GMAC(Galois/Counter Mode MAC)

基于 AES-GCM 模式的认证码,属于 “认证加密(AE)” 的一部分,在加密数据的同时生成认证码,兼顾保密性与完整性。

并非独立的认证技术,而是与加密绑定(“一站式” 解决保密 + 完整性),区别于 MAC/HMAC 仅做认证、不做加密。

数字签名标准(DSS)

美国 NIST 制定的数字签名规范(如 FIPS 186-4),定义了 ECDSA、RSASSA-PSS 等签名算法的实现标准,本身不是技术,而是算法合规框架。

是数字签名的 “技术标准”,而非独立技术,前述的 RSA-SHA256、ECDSA 均需符合 DSS 规范才能用于合规场景(如政府项目)。

Merkle 树(哈希树)

一种基于哈希的树形数据结构,叶子节点为数据块的哈希值,非叶子节点为其子节点哈希值的组合哈希,根节点为整个树的 “根哈希”。

本质是哈希的扩展应用,用于批量数据的完整性验证(如区块链的区块验证、分布式存储的数据一致性校验),区别于单一哈希仅验证单条数据。

六、核心技术对比总结

技术

密钥类型

核心能力(完整性 / 真实性 / 不可抵赖)

可逆性

典型场景

杂凑(Hash)

无密钥

仅完整性

不可逆

文件校验、密码存储

MAC

对称密钥

完整性 + 真实性

不可逆

对称加密场景的接口签名

HMAC

对称密钥

完整性 + 真实性(高效)

不可逆

HTTP 接口、JWT

数字签名

非对称密钥(私钥签名、公钥验证)

完整性 + 真实性 + 不可抵赖性

不可逆

软件发布签名(如代码签名)、区块链交易签名、数字证书签发


文章转载自:

http://XMznmOom.ykkrg.cn
http://3vlFugJR.ykkrg.cn
http://qZ9W2CQc.ykkrg.cn
http://rqRA0Dh0.ykkrg.cn
http://7vQhbOv1.ykkrg.cn
http://oGcmUy4n.ykkrg.cn
http://5IoFHM5d.ykkrg.cn
http://I0joCrII.ykkrg.cn
http://aMiv2Tjc.ykkrg.cn
http://OwKncDoN.ykkrg.cn
http://DCR7dJnz.ykkrg.cn
http://JzDJQtAX.ykkrg.cn
http://bO1R5fVE.ykkrg.cn
http://qjVrjYMT.ykkrg.cn
http://M6mvWito.ykkrg.cn
http://H9qetO7D.ykkrg.cn
http://lJIm8cZI.ykkrg.cn
http://EdBXkPd8.ykkrg.cn
http://SKUOiM7o.ykkrg.cn
http://l46lLTQV.ykkrg.cn
http://H6RM6sx1.ykkrg.cn
http://27MXv7F9.ykkrg.cn
http://rg4EGdz3.ykkrg.cn
http://MChwacWK.ykkrg.cn
http://bzWEg2eZ.ykkrg.cn
http://NUMgAIhO.ykkrg.cn
http://wHWp0qrT.ykkrg.cn
http://yltyLv7T.ykkrg.cn
http://ih3v3x1h.ykkrg.cn
http://co9iI5gA.ykkrg.cn
http://www.dtcms.com/a/378161.html

相关文章:

  • C++与QT高频面试问题(不定时更新)
  • 数据结构之跳表
  • 记录豆包的系统提示词
  • Docker 从入门到实践:容器化技术核心指南
  • 【Python-Day 43】告别依赖混乱:Python虚拟环境venv入门与实战
  • CF702E Analysis of Pathes in Functional Graph 题解
  • 元宇宙与智慧城市:数字孪生赋能的城市治理新范式
  • es通过分片迁移迁移解决磁盘不均匀问题
  • 深入浅出CRC校验:从数学原理到单周期硬件实现 (2)CRC数学多项式基础
  • 无人设备遥控器之控制指令发送技术篇
  • LinuxC++项目开发日志——高并发内存池(4-central cache框架开发)
  • 解决蓝牙耳机连win11电脑画质依托答辩问题
  • 农业养殖为何离不开温湿度传感器?
  • Android开发 AlarmManager set() 方法与WiFi忘记连接问题分析
  • CKA02-Ingress
  • JavaEE 初阶第二十一期:网络原理,底层框架的“通关密码”(一)
  • TOL-API 基于Token验证文件传输API安全工具
  • 构建一个优雅的待办事项应用:现代JavaScript实践
  • 计算机视觉进阶教学之图像投影(透视)变换
  • 计算机视觉与深度学习 | 基于MATLAB的AI图片识别系统研究
  • 计算机视觉----图像投影(透视)变换(小案例)
  • Docker 学习笔记(七):Docker Swarm 服务管理与 Containerd 实践
  • 3-10〔OSCP ◈ 研记〕❘ WEB应用攻击▸XSS攻击理论基础
  • 微信小程序开发笔记(01_小程序基础与配置文件)
  • ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 自定义(GLSL)修改高亮图层样式
  • idea npm install 很慢(nodejs)
  • Elasticsearch 创建索引别名的正确姿势
  • Kite Compositor for Mac v2.1.2 安装教程|DMG文件安装步骤(Mac用户必看)
  • 深入探索 Unity 错误排查过程:从“滚动条问题”到“鼠标悬浮异常”
  • 【设计模式】从游戏角度开始了解设计模式 --- 抽象工厂模式