密码学科普小说 · 第 8 章

数据的指纹:哈希函数

穿越机好像出了点故障,这次把他们扔回了温先生的磨坊。温先生正在为一件事发愁:县里的粮仓账本,每个月都有人偷偷改一两行,却怎么也抓不到。

“我总不能把整本账抄一份藏起来,每个月逐字比对吧?”温先生说,“那得比对到猴年马月。”

Bob 想了想:“如果有一种办法,能把整本账压缩成一小串‘指纹’,账本改了一个字,指纹就完全变样——您只要藏好这串指纹,每个月比一比指纹就行了。”

哈希:数据的指纹 “今晚八点磨坊见” “今晚九点磨坊见” SHA-256 4f1a…e93c (64位十六进制) b70d…01a7 (完全不同) 改一个字 → 指纹面目全非(雪崩效应);从指纹倒推原文 → 做不到(单向)
只改了一个字,哈希值就面目全非。

这就是密码学哈希函数。Bob 列了它的几个特点:

第一,输入多长都行,输出长度固定。SHA-256 不管你喂给它一个字还是一整部《红楼梦》,都吐出 256 个比特(写成 64 个十六进制字符)。

第二,雪崩效应。输入改动一个比特,输出大约一半的比特都会变。“八点”改成“九点”,指纹完全认不出来。

第三,单向。给你一串指纹,你没办法倒推出原文是什么。

第四,抗碰撞。你几乎不可能找到两段不同的内容,算出同一个指纹。

温先生听完拍案叫绝:“好比揉面!面粉、水、鸡蛋,揉成一个面团。同样的料,揉出来的面团一模一样;少放一粒盐,面团就不一样了。可你拿着面团,没法把鸡蛋再揉回来。”

Alice 笑了:“温先生,您这个比喻可以去写科普了。”

📌 课堂小结:哈希在比特币里干什么?

1. 防篡改的链条:每个区块都记录上一个区块的哈希。改了历史上任何一个区块,它后面所有区块的“上一块哈希”都对不上了。
2. 工作量证明(挖矿):矿工不停地换一个随机数,直到区块头的哈希值小于某个目标值。没有捷径,只能硬算。
3. 地址:地址是公钥经过 SHA-256 和 RIPEMD-160 等哈希、再编码得到的。
4. 助记词校验:第 10 章你会看到,助记词最后几个比特就是用 SHA-256 算出来的“校验和”。
⚠️ 哈希不是加密:它没有“解密钥匙”。用哈希存密码时要加盐、用慢哈希(如 bcrypt、Argon2),GreyPass 就是这么做的。

当天晚上,温先生用 Bob 教的“手算简化版哈希”给账本算了指纹,刻在一块石头上,埋在了自家院子里。下个月,账本又被改了一行,指纹一比就露了馅。偷改账本的人,正是当初只认红包的那个官差。

📌 思考题

1. 哈希和加密最大的区别是什么?
2. 为什么网站数据库被盗时,“密码明文”比“密码哈希”危险得多?