区块链与密码学第2-3讲:区块链基础技术大剖析之哈希函数
Posted Dig Quant
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区块链与密码学第2-3讲:区块链基础技术大剖析之哈希函数相关的知识,希望对你有一定的参考价值。
【本课堂内容全部选编自PlatON首席密码学家、武汉大学国家网络安全学院教授、博士生导师何德彪教授的《区块链与密码学》授课讲义、教材及互联网,版权归属其原作者所有,如有侵权请立即与我们联系,我们将及时处理。】
2.4.1 哈希函数
区块链作为一个诞生刚到十几年的技术,的确算是一个新兴的概念,但是它所用到的基础技术全是当前非常成熟的技术。可以说是一个技术的“结晶体“。
区块链的基础技术如哈希运算、数字签名、P2P网络、共识算法以及智能合约等,在区块链兴起之前,很多技术已经在各种互联网应用中被广泛使用。
但这并不意味着区块链就是一个新瓶装旧酒的东西。就好比积木游戏,虽然是一些简单有限的木块,但是组合过后,就能创造出一片新的世界。
同时,区块链也并不是简单的重复使用现有技术,例如共识算法、隐私保护在区块链中已经有了很多的革新,智能合约也从一个简单的理念变成了一个现实。
区块链“去中心化”或“多中心”这种颠覆性的设计思想,结果其数据不可篡改、透明、可追溯、合约自动执行等强大能力,足以掀起一股新的技术风暴。
本节课主要探讨这些技术的原理及在区块链系统中的作用。首先从哈希函数说起。
什么是哈希运算
哈希算法(Hash Algorithm)即散列算法的直接音译。它的基本功能概括来说,就是把任意长度的输入(例如文本等信息)通过一定的计算,生成一个固定长度的字符串,输出的字符串称为该输入的哈希值。在此以常用的SHA-256算法分别对一个简短的句子和一段文字求哈希值来说明。
输入:
This is a hash example!
哈希值:
17f2cf0bcbfbc11a8ab6b6883b03c721407da5c97
45d46a5fc53830d4749504a
我们在第一单元课程中对涉及哈希函数的公钥与私钥的的换算有细致的讲解,请看:
哈希运算的特性
一个优秀的哈希算法要具备正向快速、输入敏感、逆向困难、强抗碰撞等特征。
正向快速
正向即由输入计算输出的过程,对给定数据,可以在极短时间内快速得到哈希值。如当前常用的SHA256算法在普通计算机上一秒钟能做2000万次哈希运算。
输入敏感
输入信息发生任何微小变化,哪怕仅仅是一个字符的更改,重新生成的哈希值与原哈希值也会有天壤之别。同时完全无法通过对比新旧哈希值的差异推测数据内容发生了什么变化。
因此,通过哈希值可以很容易地验证两个文件内容是否相同。该特性广泛应用于错误校验。在网络传输中,发送方在发送数据的同时,发送该内容的哈希值。
接收方收到数据后,只需要将数据再次进行哈希运算,对比输出与接收的哈希值,就可以判断数据是否损坏。
逆向困难
要求无法在较短时间内根据哈希值计算出原始输入信息。该特性是哈希算法安全性的基础,也因此是现代密码学的重要组成。哈希算法在密码学中的应用很多,此处仅以哈希密码举例进行说明。
当前生活离不开各种账户和密码,但并不是每个人都有为每个账户单独设置密码的好习惯,为了记忆方便,很多人的多个账户均采用同一套密码。
如果这些密码原封不动地保存在数据库中,一旦数据泄露,则该用户所有其他账户的密码都可能暴露,造成极大风险。所以在后台数据库仅保存密码的哈希值,每次登录时,计算用户输入的密码的哈希值,并将计算得到的哈希值与数据库中保存的哈希值进行比对。
强抗碰撞性
即不同的输入很难可以产生相同的哈希输出。当然,由于哈希算法输出位数是有限的,即哈希输出数量是有限的,而输入却是无限的,所以不存在永远不发生碰撞的哈希算法。
但是哈希算法仍然被广泛使用,只要算法保证发生碰撞的概率够小,通过暴力枚举获取哈希值对应输入的概率就更小,代价也相应更大。只要能保证破解的代价足够大,那么破解就没有意义。
就像我们购买双色球时,虽然我们可以通过购买所有组合保证一定中奖,但是付出的代价远大于收益。优秀的哈希算法即需要保证找到碰撞输入的代价远大于收益。
区块链科普之哈希函数的应用
哈希函数在区块链之前,就已经得到了广泛应用,以下为一些常见的应用场景:
消息认证码
使用单向散列函数可以构造消息认证码。消息认证码是将“发送者和接收者之间的共享密钥”和“消息,进行混合后计算出的散列值。使用消息认证码可以检测并防止通信过程中的错误、篡改以及伪装。
数字签名
在进行数字签名时也会使用单向散列函数。数字签名是现实社会中的签名(sign)和盖章这样的行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接施加数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。
伪随机数生成器
使用单向散列函数可以构造伪随机数生成器。密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。
一次性口令
使用单向散列函数可以构造一次性口令(one-time password)。一次性口令经常被用于服务器对客户端的合法性认证。在这种方式中,通过使用单向散列函数可以保证口令只在通信链路上传送一次(one-time),因此即使窃听者窃取了口令,也无法使用。
本内容来自用户“wilsonyx”的总结
防篡改是哈希的功劳?
每个区块头包含了上一个区块数据的哈希值,这些哈希层层嵌套,最终将所有区块串联起来,形成区块链。
区块链里包含了自该链诞生以来发生的所有交易,因此,要篡改一笔交易,意味着它之后的所有区块的父区块哈希全部要篡改一遍,这需要进行大量的运算。
如果想要篡改数据,必须靠伪造交易链实现,即保证在正确的区块产生之前能快速地运算出伪造的区块。同时在以比特币为代表的区块链系统要求连续产生一定数量的区块之后,交易才会得到确认,即需要保证连续伪造多个区块。
只要网络中节点足够多,连续伪造的区块运算速度都超过其他节点几乎是不可能实现的。
另一种可行的篡改区块链的方式是,某一利益方拥有全网超过50%的算力,利用区块链中少数服从多数的特点,篡改历史交易。
然而在区块链网络中,只要有足够多的节点参与,控制网络中50%的算力也是不可能做到的。如果某一利益方拥有了全网超过50%的算力,它就已经成为既得利益者,从收益角度来看,维护会比破坏价值更大,因此肯定会更坚定地维护区块链网络的稳定性。
可以实现内容改变快速检测的一种树
除上述防篡改特性,基于哈希算法组装出的默克尔树也在区块链中发挥了重要作用。默克尔树本质上是一种哈希树,1979年瑞夫·默克尔申请了该专利,故此得名。
前面已经介绍了哈希算法,在区块中默克尔树就是当前区块所有交易信息的一个哈希值。但是这个哈希值并不是直接将所有交易内容计算得到的哈希,而是一个哈希二叉树。
首先对每笔交易计算哈希值;然后进行两两分组,对这两个哈希值再计算得到一个新的哈希值,两个旧的哈希值就作为新哈希值的叶子节,如果哈希值数量为单数,则对最后一哈希值再次计算哈希值即可;
然后重复上述计算,直至最后只剩一个哈希值,作为默克尔树的根,最终形成一个二叉树的结构。在区块链中,我们只需要保留对自己有用的交易信息,删除或者在其他设备备份其余交易信息。
如果需要验证交易内容,只需验证默克尔树即可。若根哈希验证不通过,则验证两个叶子节点,再验证其中哈希验证不通过的节点的叶子节点,最终可以准确识别被篡改的交易。
有关于哈希函数就讲到这里啦,下节课我们将解析区块链基础技术之数字签名,和我们日常的签名有什么不一样呢?下节课揭晓!
关注点宽学园,每周持续更新区块链系列课程,小宽带你进入区块链世界。
【区块链与密码学】课堂回顾:
以上是关于区块链与密码学第2-3讲:区块链基础技术大剖析之哈希函数的主要内容,如果未能解决你的问题,请参考以下文章