区块链中的密码学技术之哈希函数

为了保证存储于区块链中的信息的安全与完整,区块及区块链的定义和构造中使用了包含密码哈希函数和椭圆公钥密码技术在内的大量的现代密码学技术,同时,这些密码学技术也被用于设计基于工作量证明的共识算法并识别用户。本篇将介绍区块链中的密码学技术之一——哈希函数。

哈希函数的定义

密码哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值成为哈希值,也被称为散列值。以哈希函数为基础构造的哈希算法,在现代密码学中扮演着重要的角色,常用于实现数据完整性和实体认证,同时也构成多种密码体制和协议的安全保障。
在比特币系统中主要使用了SHA256哈希函数。下面我们简单介绍下SHA256哈希函数。

SHA256哈希函数

SHA是一类由美国国家标准与技术研究院发布的密码哈希函数。1993年,SHA的第一个成员发布,两年后,相继发布了SHA224、SHA256、SHA384、SHA512,这些算法被统称为SHA2。SHA256哈希函数,是指对于任意小于2^64位的消息,SHA256函数会产生一个256位的消息摘要。

在比特币系统中SHA256哈希函数起到了很重要的作用,无论是区块的头部信息还是交易数据,都会使用该哈希函数去计算相关数据的哈希值,以保证数据的完整性。同时在比特币系统中,基于寻找给定前缀的SHA256哈希值,设计了工作量证明的共识机制。SHA256哈希函数也被用来构造比特币地址,即用来识别不同的用户。

SHA256哈希函数的计算过程

SHA256是一个Merkle-Damgard结构的迭代哈希函数,其计算过程分为两个阶段:消息的预处理和主循环。在消息的预处理阶段,主要完成消息的填充和扩展填充,将所输入的原始消息转化为n个512比特的消息块,之后对每个消息块利用SHA256压缩函数进行处理,SHA256的计算流程如下图所示。这个计算是一个迭代计算的过程,当最后1个消息快(第n个消息块)处理完毕后,最终的输出值就是所输入的原始消息的SHA256的值。


区块链中的密码学技术之哈希函数_第1张图片
SHA256函数计算过程.jpg

哈希函数的主要性质

哈希函数主要有三个性质,哈希函数的主要应用也是从这三个性质而来。

1、抗碰撞性

所谓碰撞是指两个不同的消息在同一个哈希函数的作用下,具有相同的哈希值。哈希函数的抗碰撞性是指寻找两个能够产生碰撞的消息在计算上是不可行的。这里需要注意的是,在计算上不可行,并不是并不存在两个碰撞的消息。由于哈希函数是把大空间的消息压缩到小空间上,碰撞是肯定存在的。例如,如果哈希值的长度固定为256位,如果我们依次顺序获取1,2,3,4,……,2^256 +1这2^256+1个输入值的哈希值,则肯定可以找到两个不同的输入值,但它们的哈希值相等。

根据生日悖论,如果随机挑选其中的2^130+1 个输入,则有99.8%的概率可以发现至少一对碰撞的输入。对于哈希值长度为256位的哈希函数,要找到碰撞对,平均需要完成2^128 次哈希计算,如果计算机每秒进行10000次哈希计算,则需要10^27 年才能完成这2^128次计算。这样的计算由于非常耗时,而在现实中变得不可能,所以哈希函数具有抗碰撞性。

哈希函数的抗碰撞特性可以用来做完整性验证。我们可以把哈希值作为原始输入值的指纹(因为很难找到另外一个消息经过哈希计算后得到相同的哈希值)。如果原消息在传输过程中被修改了,那么运行哈希函数后得到的新哈希值会和原来的哈希值不一样,这样就很容易发现消息在传输的过程中是否被修改,即信息的完整性有没有受损。对于区块链来说,哈希函数的抗碰撞性可以用来做区块和交易的完整性验证。在区块链中,某个区块的头部信息中会存储着前一个区块的信息的哈希值,如果拿到前一个区块的信息,任何人都可以对比计算出来的哈希值和存储的哈希值,来检测前一个区块信息的完整性。

2、原像不可逆性

原像不可逆指的是,知道输入值,很容易通过哈希函数计算出哈希值;但是知道哈希值没有办法计算出原来的值。这意味着依据哈希函数的输出是不能计算出该哈希函数的输入的,即已知H(m),试图计算出原始值m,在计算上是不可行的。更特别的,若对消息m进行哈希计算时,引入一个随机前缀r,依据哈希值H(r||m),难以恢复出消息m,即哈希函数值隐藏了消息m。
承诺方案被人为是密码学领域中一类重要的密码学基本模型,承诺方案具有隐藏性和保密性。哈希函数的这种特性正好可以保证承诺方案的实行。如若Alice想承诺某个信息,Alice可以将信息储存起来,同时将该信息的哈希值发送给Alice想承诺的人。无论什么时候,ALice想公开信息,所有持有人都可以将公开的信息进行哈希计算求出哈希值,如果跟自己保存的哈希值一致,则说明信息没有被修改或破坏。在存储的过程中,任何人不能修改信息,即使是Alice也不行。

承诺方案包含了以下两个算法:

  • 承诺值的计算commit(m,r):输入消息m和随机值r,返回承诺值c = commit(m,r);
  • 承诺值的验证verify(c,m,r):输入承诺c,消息m和随机值r,若c = commit(m,r),则m没有被修改,否则m被修改了。

显然,正这里利用哈希函数的抗碰撞性和原像不可逆,可以很好的实现承诺方案。

3、难题友好性

难题友好性指的是没有便捷的方法产生一个满足特殊要求的哈希值。可以定义为:一个哈希函数H称为难题友好的,如果对于每个n位的输出y,若k是从一个具有较高不可预测性(高小熵high min-entropy)分布中选取的,不可能以小于2^n的时间找到一个x,使得H(k||x)=y。这意味着如果有人想通过锁定哈希函数来产生一些特殊的输出y,而部分输入值以随机方式选定,则很难找到另外一个值,使得其哈希值正好等于y。

哈希函数的难题友好性构成了基于工作量证明的共识算法的基础。例如,给定字符串“blockchain”,并在这个字符串后面连接一个整数值串x,对连接后的字符串进行SHA256哈希运算,要求得到的哈希结果(十六进制)以若干个0开头。按照这个规则,由x=1出发,递增x的值,我们需要经过2688次哈希运算才能找到前3位均为0的哈希值,而要找到前6位均为0的哈希值,则需要进行620969次哈希运算。也就是说没有更快捷的方法来产生一个满足要求的哈希结果。这样通过哈希运算得出的符合特定要求的哈希值,可以作为共识算法中的工作量证明。

哈希指针链

哈希指针是一类数据结构,除了包含通常的指针外,还包含一些数据信息以及与这些信息相关的密码哈希值,这就使得正常的指针可用于取回信息,哈希指针用于验证信息是否发生改变。

区块链可以看作一类使用哈希指针的链表,如图,这个链表链接一系列的区块,每个区块包含数据以及指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告诉前一个区块的位置,也提供一个哈希值去验证这个区块所包含的数据是否发生改变。


区块链中的密码学技术之哈希函数_第2张图片
哈希指针链.jpg

我们可以使用区块链去构造一个防篡改的日志系统。在这个系统中,基于区块链的日志节点链表被用来存储数据,链表节点通过哈希指针链链接,新节点追加在日志链表的尾部。同时,日志链表的头哈希指针所指向的头节点内容不可改变。若日志链表中的某个节点的数据被篡改,则系统能够检测出来。

不妨假定攻击者改变了节点k的数据,由于其后继节点k+1存储了节点k的哈希值,由于密码哈希函数的抗碰撞性,通过简单的计算节点k的数据的哈希值,就能发现计算出的值与节点k+1的哈希指针值不一致,于是可以断定节点k或节点k+1的信息被篡改。当然,攻击者可能能够连续改变前一个节点的哈希值来掩盖不同,但这个策略在处理日志链表的头节点时将会失败。特别地,一旦我们将链表头部的哈希指针存储在不能改变的地方,攻击者将不能改变任何节点而不被发现。

因此,若攻击者想在日志链表中的任意位置改变数据,为保持一致性,他必须向表头方向修改所有的哈希指针,最终由于不能改变链表头部而失败。因此,只需要单个哈希指针,基本上就能保证整个链表的哈希值的一致性,从而达到防篡改的目的。

更多区块链技术请关注公众号:blockchain_jiangsong


区块链中的密码学技术之哈希函数_第3张图片

你可能感兴趣的:(区块链中的密码学技术之哈希函数)