数字签名把 7.5 的"私钥加密"从原型盖成正式楼:对数据先算哈希指纹(SHA-256),再用自己的私钥加密这块指纹——这就是签名;收信人用对方的公钥解出签名里的指纹,再对收到的数据自己重算一遍指纹,两边一比:相等 = 确系本人发的 + 一个字都没被改过。一张签名同时兑现三件事:认证(是真身发的)、完整性(没被篡改)、不可否认(私钥只有一把,签了赖不掉——电子合同的法律根基就在这)。之前一系列欠条在此全部结清:7.2 说"加密防不了篡改",7.4 留了"公钥人人能用、可冒充"的暗门,7.5 搭好"私钥造、公钥验"的地基——本节一次收口。注意:签名不是把数据加密倒过来,签的是指纹不是数据本身。
本节是 7.2~7.5 整条"加密线"的总装车间:7.5 给了地基(私钥加密方向 = 身份认证),本节加上哈希这个新零件,装配出完整的数字签名——同时补上 7.2 埋的两个窟窿(防不了篡改、防不了冒充)。
哈希其实早见过:7.1 讲口令时服务器存的就是哈希+盐(只存指纹不存原文)——同一个工具,两个岗位。老账也对上:7.1 的数字证书里 CA"盖信任章",盖的就是本节的数字签名;5.21 的 WPA2 四步握手里有 MIC(消息完整性校验),就是"防篡改"思想在无线第一线的简化版。看完本节,7.1~7.6 六节连成一条完整的故事线:认证(7.1)→ 加密两条路线(7.2)→ 共享密钥(7.3)→ 公开密钥(7.4)→ 私钥方向(7.5)→ 合体成签名(7.6)。
一、签名要一次证明三件事
手写签名的日常作用拆开看是三件事,数字签名要全部数字化地兑现:
- 这是谁写的(认证)——不能被人冒充;
- 有没有被改过(完整性)——半路调包要现形;
- 他能不能赖账(不可否认)——签了字就得认。
前几节学过的工具各自只能兑现一角:7.4 的公钥加密只管保密;7.5 的私钥加密能证身份,但对篡改无能为力(密文改了照样能"解开",只是解开是乱码)。数字签名 = 私钥加密(证身份)+ 哈希指纹(防篡改)合体,三件事一次办齐。
二、完整流程:先取指纹,再盖章(第一张配图)
发送方(老墨)两步:
- 算指纹:把要发的数据喂给哈希函数(SHA-256),得到一串固定 256 位的"数据指纹";
- 盖私钥章:用自己的私钥加密这块指纹——得到的密文就是数字签名,附在数据后面一起发出去。
注意:数据本身可以明文发(签名管的是"谁发的、改没改",不管"有没有人看"——要保密就再叠加 7.4 的公钥加密,两件事各走各的)。
接收方(小波)两路并进:
- 路A:对收到的数据,用同样的哈希函数自己重算一遍指纹;
- 路B:用老墨的公钥解开签名,取出他当年盖进去的指纹;
- 比对:两路指纹相等 → 通过;不等 → 要么不是他签的(冒充),要么数据被改过(篡改)——两种情况都一票否决。
三、哈希指纹的四个特性:比对为什么靠得住
哈希函数是本节的新零件,四个特性缺一不可:
- 雪崩效应:输入改 1 位,输出面目全非——"改一个逗号"也逃不掉;
- 定长输出:1 KB 和 1 GB 的文件,指纹都是 256 位;
- 单向性:从指纹反推出原文,不可能;
- 抗碰撞:找两份指纹相同的不同数据,难到没有现实意义。
第 ④ 条是整个比对的地基:指纹相等 = 数据必然相同。常见算法 SHA-256(当代标准)、SHA-3;MD5、SHA-1 已被破解淘汰——指纹能被伪造的签名等于没有签名。
四、为什么只对指纹盖章,不盖整份数据
还是 7.4 那个老短板:RSA 又慢、又只能处理小块数据。对一个 1 GB 的文件直接"私钥加密",要切成几万块慢慢算,不现实。
哈希指纹把问题变简单:无论多大的数据,先压缩成固定的 256 位,私钥只盖这一小块,一秒完成。指纹没变 = 数据没变(第 ④ 条兜底)——既省力,又完整。
这也解释了签名的形态:你验证软件、证书时看到的"签名"从来不是数据的加密版,只是一小块加密过的指纹。
五、签名 ≠ 加密:最容易混的一对
| 加密(7.4 方向①) | 签名(本节) | |
|---|---|---|
| 用的钥匙 | 对方的公钥 | 自己的私钥 |
| 处理对象 | 整份数据 | 数据的哈希指纹 |
| 回答的问题 | "别人能不能看懂" | "是不是本人发的、改没改" |
| 验证方式 | 私钥解开即读 | 两路指纹比对 |
口诀:公钥加密是"寄挂号信",私钥签名是"按手印"——挂号信管看不看得到,手印管是不是你按的。HTTPS 里两者同台:签名验服务器身份 + 公钥加密送会话密钥 + AES 加密流量。
六、动手 Demo(Demo94)
7.5 的 Demo93 已经跑过"盖章/验章",本节补齐另一半:亲眼看看哈希指纹的雪崩效应。
第一步:给文件取指纹
随便找个文件(比如桌面上的任意一张图),按 Win 键 → 输入 powershell → 回车,粘贴运行:
Get-FileHash "C:\Users\admin\Desktop\任意一个文件.jpg" -Algorithm SHA256 | Format-List
看什么算成功:打印出一串 64 位的十六进制字符——这就是这个文件的 SHA-256 指纹。
第二步:体验雪崩效应
把同一个文件用记事本/画图打开,随便改一个像素(或加一个空格)另存,再取一次指纹。
看什么算成功:两次指纹完全不同——内容只动了万分之一,指纹已经天翻地覆。这就是"改 1 位、全变样",也是签名能抓篡改的原因。
第三步:串起完整流程
再跑一遍 Demo93 的 SignData/VerifyData 两段(真章 True、篡改 False)——现在你能说清它内部发生了什么:SignData = 哈希指纹 + 私钥盖章;VerifyData = 重算指纹 + 公钥取章 + 比对。
30 秒实验:用 Get-FileHash 验证一个下载文件的完整性(很多软件官网会公布 SHA-256 校验值)——对比本地指纹和官网公布的值,一致才说明下载没被损坏或篡改。这就是数字签名思想的"手动挡"版本。
七、常见误区
- "数字签名就是把数据用私钥加密":签的是哈希指纹,不是数据本身。数据照常明文发(或另行加密),签名只是附在后面的一小块"指纹章"。
- "签名了数据就不会被偷看":签名管认证和完整性,不管保密。要保密得另外加密——两件事、两套机制,HTTPS 里是叠加使用的。
- "哈希是一种加密":不是。哈希没有钥匙、不可逆——它是指纹不是保险箱。7.1 存口令用它,本节做签名用它,岗位不同、原理同一个。
- "用 MD5 就行,反正只是校验":MD5/SHA-1 已能被人为制造碰撞——指纹可以伪造的签名毫无意义。一律 SHA-256 起步。
- "验签通过 = 万事大吉":验签证明"这段数据出自对应私钥且未被改",但那把公钥是不是真本人的,还是要 7.1 的数字证书兜底——老问题老答案。
八、动手自测
点开自测(先自己答,再展开对答案)
1. 数字签名一次兑现哪三件事?分别靠哪个环节兑现? 2. 写出发送方和接收方的完整步骤(各两三步)。 3. 为什么签名前要先算哈希,而不是直接用私钥加密整份数据? 4. 哈希的四个特性是什么?哪一个保证"指纹相等 = 数据相同"? 5. 签名和加密在"用哪把钥匙、处理什么对象"上有何区别? 6. MD5 为什么不能再用于签名?答案
1. **认证**(公钥能解开签名 = 私钥主人盖的)、**完整性**(数据变则指纹变,比对失败)、**不可否认**(私钥唯一,签了赖不掉)——分别靠"私钥盖指纹章""两路指纹比对""私钥只有一把"兑现。 2. 发送方:①数据 → 哈希指纹;②私钥加密指纹 = 签名,随数据发出。接收方:③对数据重算指纹(路A)+ 用对方公钥解签名取指纹(路B);④两路比对,相等通过、不等否决。 3. RSA 又慢又只能处理小块(7.4 老短板),大文件按块签不现实;哈希把任意大小数据压成固定 256 位指纹,私钥只盖这一小块,一秒完成,且"指纹没变 = 数据没变"。 4. **雪崩效应、定长输出、单向性、抗碰撞**;第 ④ 条抗碰撞保证"指纹相等 = 数据相同"。 5. 加密用**对方公钥**、处理**整份数据**,回答"别人能不能看懂";签名用**自己私钥**、处理**哈希指纹**,回答"是不是本人发的、改没改"。 6. MD5 已能被人为制造**碰撞**(两份不同数据同指纹)——攻击者可以把你的签名"移植"到恶意数据上,指纹能伪造的签名等于没有签名。用 SHA-256 起步。九、下一步学什么
- ☑ 7.7(按教材顺序)
相关笔记
- 加密使用的公开密钥是真的吗(数字证书) —— "公钥得先是真的"的正题:CA 给公钥发身份证,根证书预装+信任链兜底
- 通过密钥加密的数据确认加密者身份(私钥、RSA加密、椭圆曲线加密) —— 本节的地基:私钥造公钥验;签名 = 它 + 哈希指纹合体
- 防止数据被窃听的方法(加密) —— "加密防不了篡改"这条欠条在本节正式结清
- 限制访问用户和设备的方法(身份认证) —— 哈希+盐存口令是哈希的第一个岗位;数字证书的"信任章"就是 CA 的签名
- 使用两个密钥管理数据(公开密钥加密方式) —— "RSA 慢、只能处理小块"的老短板,正是签名要绕、哈希来解的问题
- 浏览Web网站时执行的处理(DNS的域名解析、HTTP请求与HTTP响应) —— HTTPS 握手里的"签名验身份 + 加密送钥匙 + AES 加密流量"三班倒,本节是第一班