之前我们介绍过比特币诞生的偶然性和必然性,比特币是历史上第一次成功的个人依靠技术手段发行货币。若想要这个货币能够顺利流通起来,“中本聪”有很多事情要做。他必须让人们相信,这个电子现金系统的账本不是由他“中本聪”,也不是任何人能够控制和篡改的。为达到这样的自证清白的效果,他必须引用一种强大的验证机制,可以让任何人快速地发现数据被篡改,让坏人无处遁形。这种数据防篡改的技术基石正是哈希函数。
哈希函数的最基础作用是保证数据的一致性。试想,Alice在经过了一晚上的努力之后终于编写出一个非常重要的文件,她第二天要利用这个文件做很多关键的操作。那么,她如何保证这个文件没有被篡改呢?她的主机很可能被黑客或其他人侵入,如果文件直接保存在主机上,很可能的结果是文件被篡改了,如果这个文件是一个发放工资单的列表,黑客很可能会加入一些原本不存在的名字而使Alice上当受骗。
哈希函数可以解决Alice的后顾之忧,她可以在文件编写完成后,利用哈希函数对文件求取一个哈希值,然后将这个哈希值放在随身携带的U盘或其他安全环境。这样,再次决定使用文件时,只需再计算一次文件的哈希值,如果哈希值与自己保存的哈希值一致,那么也就证明了文件没有被篡改过。
很多人可能想到了,黑客又不是笨蛋,他完全可以在得到文件时先计算一次哈希值,然后修改文件后,再想办法使新的哈希值与原来的哈希值相同。这是一个不错的想法,如果这个哈哈希函数的算法不那么稳固的话,确实是可以做到的。
我们还是先来说说哈希函数的特性,哈希函数可以归纳为公式:Y=H(x)。这里面的H函数有个特点,对于不同的输入x(没有长度限定),它都可以产生一个固定长度的Y,也就是哈希值。事情好像在朝着我们的预期发展,由于Y的长度是固定的,那么也可以认为Y的取值范围是有限的,而x的长度是不固定的,那么x的取值范围是无限的,这势必会导致一个结果,出现一个x和x’,x!=x’,但H(x)=H(x’)。这就是所谓的碰撞!
回到前面的话题,如果黑客篡改了文件,并利用碰撞找到一个办法使新文件的哈希值与旧文件相同,他就作恶成功了!当然,这是不可能的,如果真的发生了我们描述的画面,那么比特币早已经胎死腹中了!事实上,哈希函数是防碰撞的,当然这个防碰撞是有一定前提的。像MD4、MD5、SHA1这样的哈希函数已经被我国密码学家、中科院院士王小云带领她的团队破解了。比特币使用的是SHA2里面的sha256哈希函数,也就是说这个哈希值的取值范围是2的256次幂,在这样的取值范围之内想要达到一次碰撞只是理论上的可能,站在这个角度上说比特币的哈希函数是防碰撞的(我们可以在下一篇来证明这个观点)。
有了哈希函数的防碰撞特性,当一个数据被修改后,可以立即通过哈希值验证出来,而比特币的基础数据结构默克尔树,以及时序的区块链式结构都是基于哈希函数构造的,这样的两个结构可以保证区块链发生的每个交易都不可篡改,一旦篡改会立刻被验证出来,并被其他节点所抛弃。
关于哈希函数的知识点尚未介绍完,我们将在下一篇再展开讨论。欢迎大家留言,评论。
|