3.2 美国国家安全局设计的密码武器——SHA256算法
在计算机技术中,存在很多种类的哈希算法,比如美国国家安全局提出的SHA系列算法、报文摘要算法、Ethash算法、RIPEMD160算法等,又比如我国提出的SM3算法等,如图3.4所示。比特币系统中使用了SHA256算法,它的全称是安全哈希算法(Secure Hash Algorithm),它是SHA系列算法中的一个,其他的还有SHA1、SHA224、SHA384和SHA512等。
图3.4│各类哈希算法示意图
SHA256算法有哪些优点呢?可以总结如下。
(1)从密文很难反推出明文。使用了SHA256算法后,即使你知道算法的步骤,也看到了最终的加密计算结果,仍然很难知道原来的内容是什么。虽然不能完全否定反推的可能,但是至少根据目前人类所掌握的计算资源和算法,是不能反推明文的。
(2)SHA256算法抵抗“哈希碰撞”的能力很强,也就是说,想要找到两组不同的明文信息对应同样的密文,从计算理论上来说是非常困难的。在SHA256算法中,明文信息只要发生一点细微的变动,哪怕只是改变了一个字或一个标点,都会使最终的密文(哈希值)产生非常大的变化。因此,一段明文总是和它的哈希值一一对应,就像每个人都有不同的指纹,人和指纹一一对应。因此,形象地说,一段信息的哈希值就相当于这段信息的“指纹”。
(3)不论输入的明文信息有多长,最后生成的密文长度总是固定的,且是一个256位的二进制数值。为了使用方便,通常会表示成64位的十六进制数值,例如一个SHA256哈希数值可以是:6D768EEF6ECAD3C29A5A629280E686CF0C3F5D5A86 AFF3CA12020C923ADC6C65。由于有这个优点,有时它会被用来压缩信息以节省存储空间。
因为SHA256算法有这些优点,它在信息科学中得到了非常广泛的应用。下面介绍它在加密信息、检验信息的一致性及压缩数据等多方面的应用。
(1)利用SHA256算法加密。因为SHA256算法是不可逆的,不能从密文反推出明文,所以它经常被用来加密重要信息,例如银行账户的密码。假设小明要开设一个银行账户,他在开户时设置了对应的密码。这个密码会存放在银行的数据库里,当他下一次存取款时,用来和他输入的密码进行比对,以确定身份。但是,如果密码以明文形式存放在数据库里,会带来极大的危险。假如二黑是银行的内部工作人员,他利用职权非法进入了数据库,知道了小明的密码,就可以取走小明的钱了。因此,为保安全,账户密码总是以密文形式存放的。小明设置的账户密码会通过SHA256算法进行加密,变成密文后存放在数据库里。下次他在银行窗口办理业务输入密码时,密码会先通过SHA256算法进行计算,再和数据库里的密文比对,如果一致,说明他的密码是正确的。经过这种加密处理,即使二黑进入了银行的密码数据库,仍然不知道小明的密码,如图3.5所示。
图3.5│哈希算法用于加密存储
(2)检验信息的一致性。假设小明要在网上发情书给他的女朋友翠花,在网络传输中,有时可能因为数据传输故障导致发送的信息不完整,或者更糟糕的是,被小明的情敌二黑中途截获并恶意篡改,原本写的是“我爱你”,翠花收到的可能是“我恨你”,小明的幸福人生从此变得岌岌可危。所幸小明是天才,他很快想出一个好办法:在发送信息时,先使用SHA256算法对原始信息进行一次计算,得到这段信息的哈希值,然后把原始信息和对应的哈希值一起发送给翠花。翠花收到信息后,也使用SHA256算法对原始信息进行一次计算得到哈希值,然后和小明发送的哈希值进行比对,如果不一致,说明原始信息出现了问题,如图3.6所示。从此,小明的妈妈再也不担心他找不到女朋友了。
图3.6│哈希算法用于通信校验的过程
(3)压缩数据。翠花长得很漂亮,她很喜欢拍照,几年的时间就拍了几万张照片,小明的计算机已经存不下了,他必须把这些资料放到其他计算机中。但是,他很想在自己的计算机中保存一份完整的档案,以便查找。于是,他使用SHA256算法对每一张照片进行计算,得到它们的哈希值,这些哈希值的数据量远远小于对应照片的数据量。小明把照片的存放位置和照片的哈希值一一对应,编制成了一张表。这样,小明能在自己的计算机里存下这张表,并随时可以根据照片的哈希值在其他计算机上找到这张照片,如图3.7所示。即使年深日久,存储在其他计算机上的照片发生存储错误,或者被人恶意修改了,他也能通过哈希值及时发现。
图3.7│哈希算法用于数据的压缩与存储
SHA256算法是一个强大的加密算法,它在各方面保障了小明的幸福生活。但是二黑也不是吃素的,他很快就发现了一个漏洞。小明在网上给翠花发送情书的时候,二黑截获了情书和对应的哈希值。这次他不但篡改了情书,也使用SHA256算法对篡改后的情书进行计算,从而得到对应的哈希值。现在二黑把这份伪造的情书和对应的哈希值发送给翠花,翠花即使进行校验,也没法发现问题。天才小明这下也傻眼了。那这个问题要怎么解决呢?