哈希函数:加密世界一切事物下方的无声机器

·阅读 4 分钟·作者:SSP Editorial Team
SSP Academy 封面:哈希函数在加密世界中如何运作

哈希函数:加密世界一切事物下方的无声机器

如果把一条区块链拆到只剩最基本的零件,你会发现几乎所有工作都由两类密码学完成。数字签名决定谁能花钱。哈希函数则把其余一切连在一起——区块、地址、挖矿、交易 ID,甚至钱包解码你即将签名内容的方式。

哈希函数很少被讲解,因为它们很少被注意。它们值得花十分钟,因为一旦理解了它们,加密世界里相当一部分东西就不再像魔法。

哈希函数做什么

哈希函数接收任意输入——一个词、一个文件、一整个区块的交易——输出一个固定长度的指纹。比特币使用的 SHA-256 永远输出 256 位,通常写成 64 个十六进制字符,无论你喂给它的是一个字母还是一个 GB。

三个性质让它有用:

确定性。 相同的输入永远得到相同的输出。任何人在任何地方都能重新计算并核对。

单向性。 拿到指纹,没有切实可行的办法倒推回输入。唯一的办法是不断猜测输入直到有一个吻合,而对于一个好的哈希,这毫无希望。

抗碰撞。 找到两个指纹相同的不同输入是不可行的。改动哪怕一个字符,输出都会完全且不可预测地改变。

哈希就是这么回事:对某个更大之物的一份简短、可核验、无法伪造的指纹。

你不知不觉遇到哈希的地方

交易 ID。 txid 就是一笔交易的哈希。所以它是唯一的,也所以它正是你粘贴进区块浏览器的那个东西——它精确指向一笔交易,没有人能造出另一笔 ID 相同的交易。

链本身。 每个区块都包含前一个区块的哈希。改动旧区块里的任何东西,它的哈希就会变,从而切断与其后每一个区块的联系。正是这条指纹链,让任何篡改历史的行为都无所遁形。

挖矿。 工作量证明是一场哈希彩票:矿工一遍遍地对区块头做哈希,每次改动一个数字,直到找到低于目标值的结果。由于哈希不可预测,没有捷径——只有更多次尝试,这就是为什么工作量证明要消耗真实能源,而这份成本换来了安全。

地址。 大多数地址都是某样东西的哈希。经典的比特币地址是公钥的哈希。SSP 的比特币地址是 P2WSH:对描述二取二花费规则的见证脚本做 SHA-256 得到的哈希。在你花费之前,链上摆着的是这份指纹,而不是密钥本身。

钱包里的哈希

哈希不只是链层面的概念,它也出现在你用来签名的软件里。

SSP Key 在你批准之前解码一笔以太坊交易时,会借助函数选择器识别这次调用在做什么——即对函数签名做 Keccak-256 哈希后得到的前四个字节。transfer(address,uint256) 得到的值以 a9059cbb 开头;approve(address,uint256) 得到的值以 095ea7b3 开头。解码器在交易开头看到这四个字节,就知道调用的是哪个函数,从而能用平实的语言告诉你:你是在转出代币,还是在授予授权。

这很好地说明了哈希的用处:为更长的东西提供一个紧凑而无歧义的指纹。它同样提醒了哈希的局限,因为四个字节实在太短,两个不同的函数可能共用同一个选择器。这正是解码器刻意采用「失败即关闭」的原因之一——任何意料之外的情况,都会退回原始数据,而不是给出一个自信的猜测。

哈希做不到的事

它们藏不住小范围的输入。 哈希是单向的,但如果输入来自一个很小的可能集合,攻击者只要把每种可能都算一遍哈希再比对就行。所以哈希过的 PIN 或短密码几乎起不到保护作用,也所以助记词是一串长长的随机单词,而不是什么好记的东西。

它们证明不了任何关于含义的事。 哈希证明两样东西完全相同,却对其中任何一个是否诚实只字不提。一笔恶意交易的哈希即便被完美核验,它依然是一笔恶意交易。

它们不是加密。 你无法「解密」一个哈希来拿回原文。凡是声称能逆转哈希的,都是在猜。

为什么这与你有关

你很少会亲手计算哈希。但理解它们,能解释好几件否则看起来像是要死记硬背的规则:

为什么 txid 能证明一笔付款存在。为什么已确认的交易无法修改。为什么挖矿要消耗能源。为什么未花费的地址暴露的是一份指纹而不是你的密钥。为什么一个长而随机的助记词是安全的,而一个短而巧妙的不是。

哈希函数是加密世界里那部分安安静静、每天运转数十亿次、就是能用的东西。知道它们保证了什么——以及没有保证什么——是理解你把钱托付给的这套系统最省力的途径之一。

分享本文

相关文章