03 数字签名与 HMAC(Digital Signatures & HMAC)
Domain 3 · 用”私钥签名”实现不可否认 + 完整 + 认证
一句话秒懂
数字签名 = 用自己私钥加密”消息的哈希值”。对方用你公钥解开比对,就能确认”确实是你发的、没被改”。HMAC 是它的对称版”半签名”——保完整但不保不可否认。
生活类比
签名像在合同末尾手写签名:别人用你公开的笔迹样本(公钥)核对,能确认是你签的、内容没被换页。HMAC 则像双方共用一个印章(共享密钥)盖骑缝章——能验有没有被改,但无法向第三方证明”到底谁盖的”(因为双方都有章)。
核心概念(大白话 + 原书定义)
1. 数字签名流程(Alice 发给 Bob)
签名(发方):
- Alice 对明文算 message digest(哈希);
- 用自己的私钥加密这个 digest → 这就是数字签名;
- 把签名附在明文后发出。
验证(收方):
- Bob 用 Alice 的公钥 解密签名,得到 digest_A;
- Bob 自己对收到的明文重算哈希,得 digest_B;
- 比对:一致 → 消息确为 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 共享钥、保整不赖账。”
自测
- 数字签名本身是否提供消息的保密性?若要让签名消息同时保密,应怎么做?(答:不提供;需再用收件人公钥加密整条消息)
- 用 HMAC 而非数字签名的主要局限是什么?(答:HMAC 基于共享对称密钥,无法提供不可否认性 nonrepudiation)