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

2.4.1 Hash(哈希)算法

(1)哈希算法的概念

哈希算法,又称散列算法,它是一类数学方法,将任意长度的二进制值转换成较短的固定长度的二进制值,这个二进制值叫作哈希值,哈希算法的公式如下:

h=hash(x)

其中x 表示任意长度的二进制串,hash 表示哈希函数,h 表示生成的固定长度的哈希值。如图2-2所示。

图2-2 哈希运算示意图

(2)哈希算法的特点

通过哈希算法转换而成的哈希值有以下几个特点:

如果某两段信息是相同的,那么生成的哈希值也是相同的;如果两段信息十分相似,但只要是不同的,那么生成的哈希值将会十分杂乱随机并且两个字符串之间完全没有关联。这两个特点分别称之为单向性和确定性。

由这两条特性可以设计各类哈希算法,并通过抗碰撞性来评价其性能。

如果两个哈希值相同,那么这两个输入值可能是相同的也可能不同,输入相同的情况称为“碰撞(Collision)”,理想的哈希算法很难靠反推找到两段哈希值一致而内容不同的明文(发生碰撞)。

哈希算法是区块链中保证交易信息不被篡改的单向密码机制,对于任意一个输入,哪怕是很小的改动,其哈希值改变也会非常大,所以可以用哈希值判断内容是否被篡改,防篡改是哈希算法的主要应用场景。

(3)常见的哈希算法

目前常用的哈希算法主要有MD算法和SHA算法两种。

MD是Message Digest 的缩写,MD算法主要包括MD4和MD5两个系列。MD4是MIT的Ronald L.Rivest 在1990年设计的,其输出为128位,但已被证明不够安全。MD5是Rivest 于1991年对MD4的改进版本,其输出也是128位。MD5比MD4的抗分析和抗差分性能更好,但相对来说其运算过程也比较复杂,运算速度较慢。

SHA是Secure Hash Algorithm的缩写,其主要包含SHA-1和SHA-2(SHA-224,SAH-256,SHA-384,SHA-512)系列,其中224、256、384、512都是指其输出的位长度。比如,SHA-256是由美国国家安全局研发,由美国国家标准与技术研究院(NIST)在2001年发布。将任何一串数据输入到SHA-256将得到一个256位的Hash值。

目前SHA-1算法已经被破解,大多数应用场景下,推荐使用SHA-256以上的算法。

由于哈希函数的多样性,不同的哈希算法特性也不尽相同。SHA算法相对于MD算法来说,防碰撞性更好,而MD算法的运行速度比SHA算法更快。常见的哈希算法如图2-3所示。

图2-3 常见的哈希算法

(4)哈希算法的用途

●信息查询。区块链的哈希值能够唯一而精准地标识一个区块,区块链中任意节点通过简单的哈希计算都可获得这个区块的哈希值,计算出的哈希值没有变化也就意味着区块链中的信息没有被篡改。同时哈希值与区块之间一一对应的关系,也使得哈希算法成为区块链网络中进行信息查询的一种重要手段。

●数据校验。由于哈希算法抗篡改的特性,可以利用哈希值进行数据的校验。在区块链网络中发送信息和传送文件的时候,经常会通过MD5算法校验数据的正确性和完整性。

●哈希指针。哈希指针是一种数据结构,是一个指向数据存储位置及其位置数据的哈希值的指针。一个普通指针只能告诉你数据的位置,哈希指针除了告诉你数据位置,还提供一种方法让你验证数据是否被篡改过。在区块链中,SHA-256算法被用来生成哈希指针,标识区块和检验的区块的正确性。

●数字摘要。顾名思义,数字摘要是对数字内容进行哈希运算,获取唯一的摘要值来指代原始完整的数字内容。数字摘要是哈希算法最重要的一个用途。用哈希函数的抗碰撞特性,数字摘要可以解决确保内容未被篡改过的问题。

扩展阅读:实践SH-256算法

在第一章的1.4节“生成一个区块链”中介绍的网站https://blockchain.adesso.ch/#也可以模拟实践SH256算法。

进入网站后单击SH256 Demo链接进入SH256 Demo页面,如图2-4所示。在该页面中的Data 文本框中可以输入任意的内容,之后单击“Make Hash”按钮,就可以在文本框中生成相应的64个字节的哈希值。

图2-4 SHA256 Demo页面

比如输入“this is Blockchain”,那么由这段文字生成的哈希值如图2-5所示。哈希值为:“693bc9ca09bb409521391e8426805c18273eaaf27da37739f79e998576237bd5”(可以数一数是不是64个字符)。只要输入的内容不变,那么生成的哈希值也不会变。

图2-5 生成哈希值

我们也可以生成指定格式的哈希值。比如说我们要生成开头三个字符是“000”的哈希值。那么可以选中“Use Difficulty”选项,此时页面如图2-6所示。在底下的“Difficulty”文本框中输入“000”之后,再单击“Search Hash”按钮,在“Nonce”框中会生成一个随机数,之后SHA256算法会根据Data 框中的内容结合这个生成的随机数,生成的哈希值为:“000a901fea8f1714213d665fa4f89d8ee9028066e657c7777f5c3053af277c30”,开头三个字符都为0,如图2-7所示。试试多点几次“Search Hash”按钮,SHA-256算法可以根据多个不同的随机数Nonce 生成不同的哈希值,但开头三个字符都是0。这种方式可以极大地加强破解算法的难度。

图2-6 选中“Use Difficulty”选项后的页面

图2-7 生成头三个字符为“000”的哈希值 LlgcOklzAiZulp/hs883b6Yv82+WeBiUYVg8bTkW8kYp+h02BmQx9BA94t2BaQq7

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