购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第三节
万物皆可哈希:防篡改防的是什么

弄明白哈希,就弄明白了关于区块链的一大半知识。关于区块链,大家似乎多少都懂一点,再往细里一问,似乎又都不懂了。例如,为什么要挖矿?挖的到底是什么?很多人就不明白了。

一说起区块链,人们就常常想到防篡改。那么,防篡改是怎么做到的呢?答案是哈希算法。人们所说的挖矿,其实是在挖一个哈希值,而且是一个很稀有的哈希值。

哈希算法也称作哈希函数,记作“HASH()”,将一串数据输入哈希函数,哈希函数就会输出一串数据,这个输出就是哈希值。

HASH(输入)=输出

这里说明一下,我们通常说的“哈希”,可能是指“哈希算法”,也可能是指“哈希值”,还有可能是指“做哈希运算”。在不同的语境中,哈希有不同的含义,但一般都不会产生混淆。

以最常见的哈希算法MD5为例:

在上面这个例子中,“weijianfan”是输入,后面那串数是输出,即哈希值。

再如:

对一个特定的哈希函数来说,不管输入多长,输出长度都是固定的。而且只要输入不变,输出是不变的。比如MD5,输入不限制长度,输出则总是128位的二进制,也就是16个字节。在上面第一个例子里,c4就是一个字节,代表了8位的二进制,即11000100。最后的3e也是一个字节,即00111110。

接下来,我们让输入的数据更长一些:

或者换成长一点的汉字:

可以看到,不管输入多长,输出都是16个字节。

哈希还有一个特点,只要输入有任何一点变化,输出都会完全不同,就好像输入是完全不同的。比如把上面这段文字中“一位”里的“一”字删掉:

在计算机中,所有数据最终都是二进制编码。我们刚才展示的输入是字符串,事实上,MD5还支持对文件的哈希,包括文本文件、图像文件、视频文件,只要是文件,都可以作为哈希函数的输入。如果你的电脑上有MD5工具,你可以试试自己运算一下,比如在Mac电脑里,在“终端”中输入md5 -s“xxx”或者md51.txt,就可以对字符串或者文件进行md5。

由于输入有任何微小的变化,哈希的输出都截然不同,所以哪怕只是改动了文件中的一个比特,哈希都可以迅速检验出来。判断一个文件是不是被人改动过,算一下哈希值就行,只要哈希值没变,文件就没有被改动过。

这就是防篡改的基础:能迅速发现有没有篡改。

一、什么是稀有的哈希值

虽然每一个哈希值都是独一无二的,但在比特币的矿工看来,他们最想算出来的哈希值,是那种前面有很多位0的哈希值。

在统计学上,哈希输出是均匀分布的,基本上,你对任意16个不同的输入做哈希,第一位是0的概率是1/2(大概有8个),前两位是0的概率是1/4,前三位是0的概率是1/8,前四位都是0的概率是1/16。

我们做个实验看看是不是这样。以下输入都是任意的:

前面说过,MD5输出是128位的,上面是用十六进制展示的,比如第一个输出的字节是“c7”,第二个输出的字节是“9a”,用二进制表示就是“11000111”“10011010”。依此方法,上面16个哈希输出也就是(点号表示省略了后面的位):

可以数一下第一位、前两位、前三位、前四位是0的哈希个数,是不是和上面说的概率差不多?当然,前四位都是0的HASH15,就可以人为定义它是这里面最稀有的一个。它出现的概率大概是每16个哈希里面出现一个,也就是平均2^4次哈希才出现一个。(注意,这里用^符号表示幂运算,2^4即2 4

那么,多少次才会出现一个前20位都是0的哈希呢?答案是2^20次,也就是1048576次,所以想在电脑上找到它,需要计算一段时间。前20位是0,就是十六进制前5个数为0,大概就是下面这个样子:

从稀有程度上讲,它还不是最稀有的,最稀有的哈希是全0,至今还没有被算出来过。

二、好的哈希算法有什么特点

好的哈希算法包括MD5、SHA - 1、SHA - 2、SHA - 256、RIPEMD - 160等,它们至少具有两个特点:第一,对于任意两个不同的输入,应该产生不同的输出,这叫抗碰撞;第二,正向计算很容易,反过来从输出倒推输入非常难,只能靠暴力猜,这叫不可逆。

如何形象地理解抗碰撞这个特点呢?

首先,哈希算法的输出必须要有一定的长度,如果长度不够,哈希值肯定会有重复的。假设一个哈希算法的输出只有一位,那么输出不是0就是1,是不是运行两三次就能找到不同输入、相同输出了?如果输出只有两位,那么输出就只有4种可能:00、01、10、11,是不是运行四五次就能找到不同输入、相同输出了?所以,MD5有128位这么长,SHA - 256有256位这么长。

其次,要保证哈希值是随机、均匀地落在整个输出空间上,哪怕输入有任何一点不同,输出都会全然不同。这样,哈希值就类似一种身份证明(ID),就像是每个输入各异的“指纹”。比如,你把一千万份不同的文件都做了哈希算法,每份文件都获得一个独一无二的哈希值,就可以把这个哈希值当作一个文件的ID。每个ID都指代了一个独一无二的文件,如果遇到ID相同的哈希值,就表明遇到了相同的文件。

再次,输出的空间是非常大的。对于像SHA - 256这样的算法,其输出位数为256位,那么可能的值就会有10^78个(即2^256个),这是多大的数值呢?有人估算过,全地球所有沙子的数量大致是7×10^21个,还不到10^22个。全宇宙星球的数量也大致不过7×10^22个,还不到10^23个。给哈希两个不同的输入,它产生相同输出的概率比下面这个例子中的概率还要小得多:

你在浩瀚宇宙中某个星球上随机选了一粒沙子,另外一个人在完全不受你影响的情况下,也随机在某个星球上随机选了一粒沙子,结果你们选择了同一颗星球中同一粒沙子,然后你们还不约而同地选择了这个沙子中的同一个原子。

接下来看第二个特点:不可逆。一个好的哈希算法,可以在短时间内完成正向计算,但反向计算几乎不可能。比如,我现在有一个比特币私钥,形如:

为了保密,我把其中16个字符用“?”代替,并给出这个私钥的MD5值:

那么,有没有计算机高手能够通过破解MD5算法,得到我这个私钥呢?

答案是:按照现在的能力,不能。

计算机高手的做法,只能是不断尝试这16个“?”可能的组合,计算其MD5值,以期有一天能算出相同的MD5值。但这种暴力猜解需要很长时间。以目前的技术,哪怕全世界计算机高手联合起来,也需要至少5年时间。 OlQKzVPpGxfCX/kAd9w8/Y5zHGsFCL6Pq/k9rf0AcgnWr6i4+286TguEQ7/lBbgt

点击中间区域
呼出菜单
上一章
目录
下一章
×