免费试读阅读约需 8 分钟
哈希函数的作用
哈希函数(hash function)接收任意输入(一个单词、一个文件、一整个区块的交易),输出一段长度固定的简短结果,称为哈希值或摘要(digest)。Bitcoin 使用的 SHA-256 总是输出 256 位,通常写成 64 个十六进制字符,无论输入是一个字母还是一整部电影。
关键的几条性质
- 确定性:相同的输入总是得到相同的哈希,在任何计算机上都一样。
- 计算快:对一个大文件做哈希,只需不到一秒。
- 单向性:仅凭一个哈希值,除了猜,没有任何切实可行的办法找到能生成它的输入。
- 雪崩效应:输入改动一个字符,输出大约一半的位都会改变,因此相似的输入会得到毫不相关的哈希。
还有一条性质叫抗碰撞性(collision resistance),指的是没有人能找到哈希相同的两个不同输入。碰撞必然存在,因为可能的输入比可能的输出多,但对于设计良好的哈希函数,找到一个碰撞所需的算力,比世上现有的全部算力还多。
你在加密领域里会在哪里遇到哈希
- 每个区块都记录着前一个区块的哈希,因此旧的历史一旦被篡改,就会留下痕迹。
- 默克尔树(Merkle tree)把一个区块中的每一笔交易逐层哈希,最终归结为一个根哈希,这样无需下载整个区块,就能证明某笔交易在这个区块里。
- 工作量证明(Proof of Work)的矿工要寻找一个低于目标数值的区块哈希,而这只能靠一个输入接一个输入地去试。
- Ethereum 地址是从公钥的 Keccak-256 哈希中截取出来的。
哈希在哪里不再保护你
哈希能证明数据自被哈希以来没有改动过。它不能说明这些数据一开始是否正确。而且,单向性只有在输入难以猜中时才成立。对一个四位数的 PIN 码做哈希,任何人都能把全部 10,000 个可能的 PIN 码逐一哈希并比对,从而把它反推出来。密码,以及人们自己编的助记词,失败的原因也一样:保护来自可能输入的数量,而不是来自哈希本身。
哈希是文件上的封印,而不是对文件内容的裁决。