什么是数字签名?它和加密有什么区别?
简化版
数字签名用来证明「这份内容确实是某人发的、且没被篡改」(认证 + 完整性)。做法是:先对内容算哈希摘要,再用私钥加密这个摘要得到签名;别人用公钥解密签名得到摘要,和自己算的摘要对比,一致就说明没被改、且确实是私钥持有者签的。它和加密的关键区别:加密用公钥、解密用私钥(保密);签名用私钥、验证用公钥(认证)——公私钥用法正好相反。
详细版
数字签名的过程:
- 签名方:
摘要 = 哈希(内容)→签名 = 私钥加密(摘要),把内容 + 签名一起发出。 - 验证方:
摘要A = 公钥解密(签名)→摘要B = 哈希(收到的内容)→ 比较摘要A == 摘要B?
如果两个摘要一致,说明:① 内容没被篡改(改了内容,摘要B 就变了);② 确实是私钥持有者签的(只有对应私钥能签出能被公钥解开的签名)。
为什么先哈希再签,而不是直接对内容签:非对称运算慢,内容可能很大,先哈希成固定长度的短摘要再签,效率高;且哈希还提供了完整性校验。
完整版教学
一、签名和加密:公私钥用法相反
这是这道题的题眼。非对称的公私钥有两种「反向」用法,对应两个完全不同的目的:
| 加密(保密性) | 数字签名(认证 + 完整性) | |
|---|---|---|
| 谁能操作 | 用公钥加密(人人可加密) | 用私钥签名(只有持有者能签) |
| 谁能还原 | 用私钥解密(只有持有者能看) | 用公钥验证(人人可验证) |
| 目的 | 只有你能看 | 证明是你发的、没被改 |
加密是「只有私钥持有者能读」,签名是「只有私钥持有者能签、但谁都能验」。 方向正好反过来。理解这个「反向」,就理解了数字签名的本质。
二、为什么私钥签名能证明身份
关键在于:私钥只有持有者一个人有,且用私钥签的东西只有对应公钥能验证通过。
所以,当你收到一份内容和签名,用某人的公钥成功验证了签名,就能推断:这个签名一定是用配对的私钥签的,而私钥只有那个人有 → 因此这份内容确实来自他,且没被篡改(篡改会导致摘要对不上)。
这就是「不可否认性」——签名者无法抵赖,因为只有他能签出这个签名。
三、哈希在签名里的作用
数字签名离不开哈希(摘要算法,如 SHA-256),它负责「完整性」:
- 哈希把任意长内容压成固定长度的摘要,且内容改一个字,摘要就面目全非(雪崩效应);
- 哈希不可逆,无法从摘要反推内容;
- 所以对摘要签名,等价于对内容签名,但更高效(摘要短,非对称运算快)。
验证方重新哈希收到的内容,和签名里解出的摘要一比,就能发现内容有没有被改。哈希保完整性,私钥签名保来源真实性,两者配合才是完整的数字签名。
四、数字签名在 HTTPS/证书里的应用
数字签名是 HTTPS 信任体系的基石:
- 证书签名:CA 用自己的私钥对「域名 + 服务器公钥」签名,做成证书;浏览器用 CA 公钥验证签名,确认证书可信(详见「数字证书」那道题)。
- 握手完整性:TLS 握手过程也用签名/MAC 保证握手消息没被中间人篡改。
可以说,没有数字签名,证书体系就无法防伪造,HTTPS 的「防冒充」也就无从谈起。
五、常见误区
- ❌ 把签名和加密搞反——加密公钥加、私钥解;签名私钥签、公钥验,方向相反。
- ❌ 以为签名是加密整个内容——是对内容的哈希摘要签名,内容本身通常不因签名而加密。
- ❌ 以为签名保证内容保密——签名只保证「来源真实 + 没被篡改」,不负责保密(保密是加密的事)。
- ❌ 以为哈希就能防篡改——单纯哈希能被连内容带哈希一起改掉;配上私钥签名,攻击者没私钥才改不了。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 签名 | 私钥对摘要签名,公钥验证 |
| 加密 | 公钥加密私钥解密,或对称密钥加解密 |
| 摘要 | 先 hash 再签名,避免对大内容直接签 |
digest = Hash(message)
signature = Sign(privateKey, digest)
Verify(publicKey, digest, signature)
签名证明“谁发的、有没有被改”,加密保证“别人看不见”。
- 误区:数字签名就是加密。 签名目标是身份认证和完整性,加密目标是机密性。
- 误区:签名要用公钥生成。 签名由私钥生成,任何持有公钥的人都能验证。
- 误区:直接对原文全文签名最常见。 实际通常先计算摘要,再对摘要签名,效率更高且格式固定。
- 追问:为什么签名能防篡改? 内容一改摘要就变,原签名无法通过公钥验证。
- 追问:HTTPS 哪里用到签名? 证书由 CA 签名,握手中服务器也可能对握手参数签名证明持有私钥。
- 追问:签名能保证保密吗? 不能,签名不隐藏内容;需要加密才能保证机密性。
七、加强记忆
数字签名 = 对内容哈希摘要 + 用私钥加密摘要,验证时用公钥解签得摘要、和重新哈希的摘要比对,保证「来源真实 + 没被篡改」(认证 + 完整性 + 不可否认)。它和加密的公私钥用法正好相反:加密是公钥加/私钥解(保密),签名是私钥签/公钥验(认证)。CA 给证书签名就是它的核心应用。