03 数字签名与 HMAC(Digital Signatures & HMAC)

Domain 3 · 用”私钥签名”实现不可否认 + 完整 + 认证

一句话秒懂

数字签名 = 用自己私钥加密”消息的哈希值”。对方用你公钥解开比对,就能确认”确实是你发的、没被改”。HMAC 是它的对称版”半签名”——保完整但不保不可否认。

生活类比

签名像在合同末尾手写签名:别人用你公开的笔迹样本(公钥)核对,能确认是你签的、内容没被换页。HMAC 则像双方共用一个印章(共享密钥)盖骑缝章——能验有没有被改,但无法向第三方证明”到底谁盖的”(因为双方都有章)。

核心概念(大白话 + 原书定义)

1. 数字签名流程(Alice 发给 Bob)

签名(发方)

  1. Alice 对明文算 message digest(哈希)
  2. 自己的私钥加密这个 digest → 这就是数字签名
  3. 把签名附在明文后发出。

验证(收方)

  1. Bob 用 Alice 的公钥 解密签名,得到 digest_A;
  2. Bob 自己对收到的明文重算哈希,得 digest_B;
  3. 比对:一致 → 消息确为 Alice 发且未被篡改。

2. 签名达成三个目标

  • 完整性(integrity):digest 一致=消息相同;
  • 认证(源)(authentication):能用发送者公钥验证=由其私钥所签;
  • 不可否认(nonrepudiation):可向第三方证明来源。

⚠️ 数字签名本身不提供保密性!它只管”是谁、没被改”。要保密,需再用收件人公钥加密整条消息(签名+加密两步叠加)。

3. 公钥使用四规则(必背)

| 目的 | 用哪把钥匙 | |—|—| | 加密发给对方的机密消息 | 对方的公钥 | | 解密收到的机密消息 | 自己的私钥 | | 给消息数字签名 | 自己的私钥 | | 验证他人签名 | 对方的公钥 |

口诀:“加密用他公、解密用我私;签名用我私、验签用他公。”

4. HMAC(Hash-based Message Authentication Code)

  • 共享对称密钥 + 哈希函数(MD5/SHA-2/SHA-3 均可)生成”部分数字签名”。
  • 只保证传输中完整性,但无不可否认(因双方共享密钥,都能生成)。
  • 比完整 DSA 签名效率高,适合对称环境。介于”裸哈希”与”公钥 DSA”之间。

5. 数字签名标准(DSS, FIPS 186-5)

联邦批准的签名算法须用 SHA-3 哈希,包含:

  • RSA 签名(RFC 8017)
  • ECDSA(椭圆曲线签名,天然支持不可否认)
  • EdDSA(RFC 8032)

真实案例

  • 代码签名:软件厂商用数字签名给下载的 applet/补丁”背书”,你验证签名确认来源可信、未被植入木马。
  • 合同反悔:签了名就不能抵赖”这不是我发的”——这正是 nonrepudiation 的法律价值。

考试怎么考

  • 题型 A:问”数字签名能实现哪三个目标” → 完整、认证、不可否认(注意不是保密)。
  • 题型 B:给场景选钥匙——”我要给文件签名”用自己私钥;”验证同事签名”用同事公钥
  • 必记混淆项:① 签名=私钥加密 digest,不是加密全文;② 签名不保密;③ HMAC 无不可否认;④ DSS 用 SHA-3 + RSA/ECDSA/EdDSA。

记忆口诀

“签名:私钥匙密digest、公钥匙解验真身;四规则:加他用公、解我用私、签我用私、验他用公;HMAC 共享钥、保整不赖账。”

自测

  1. 数字签名本身是否提供消息的保密性?若要让签名消息同时保密,应怎么做?(答:不提供;需再用收件人公钥加密整条消息)
  2. 用 HMAC 而非数字签名的主要局限是什么?(答:HMAC 基于共享对称密钥,无法提供不可否认性 nonrepudiation)

This site uses Just the Docs, a documentation theme for Jekyll.