获取消息的“指纹”

 

指纹,又称“人体身份证”,人人都有却各不相同。计算机中处理的消息,也有其独特的“指纹”,通过对比“指纹”,就能够知道两条消息是否相同,而计算机中用来生成“指纹”的就是单向散列函数。

 

单向散列函数,又称哈希函数、消息摘要函数,存在一个输入和输出,输入又称为消息,输出称为散列值,又叫消息摘要、指纹。单向散列函数就是一种采集文件“指纹”的技术,其生成的散列值就相当于消息的“指纹”。单向散列函数可以根据消息的内容计算出散列值,对于任意消息,单向散列函数都将其作为单纯的比特序列来处理,也即根据比特序列计算出散列值。就好比每个人有不同的指纹,每条消息也具有不同的散列值,可以用来检查消息的一致性,也即完整性。常见的单向散列函数有MD4、MD5、SHA、RIPEMD等,其中,MD4、MD5、SHA-1已经不再安全,SHA-2包括SHA-256、SHA-384和SHA-512等,SHA-3则最终选定了Keccak算法。

 

 

单向散列函数必须具备以下性质:(1)任意长度的消息都能计算出短且固定长度的散列值;(2)能够根据消息快速计算出散列值;(3)不同的消息输出不同的散列值;(4)具备单向性,无法通过散列值反算出消息。

 

在比特币中,有很多地方都运用了单向散列函数。

 

比特币交易是通过比特币地址来完成的,地址是由公钥的散列值生成的。具体来说,将椭圆曲线DSA的公钥输入SHA-256和RIPEMD-160两个单向散列函数,求出散列值,再附加一些信息后,通过Base58Cheek编码转换成字符串,生成类似于以下形式的地址:

1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

 

区块链的结构如下,一个区块由若干条交易和一个区块头组成,区块头中保存了上一个区块的区块头的散列值和本区块所有交易的整体散列值。如下图中,区块头2中的散列值H2就是根据区块头1计算出来的;散列值T2是根据区块2中的所有交易数据计算出的散列值。如果区块1中某一笔交易被篡改,对应的散列值T1就需要重新计算,那么相对应的区块头2中的散列值H2就会发生改变,由此就增加了篡改区块链上数据的难度。

 

 

要向区块链添加新的区块,矿工需要生成合法的区块头,所谓合法,即对区块头中“前一区块的区块头的散列值”的格式是有规定的。使用PoW工作量证明在挖矿时,矿工需要不断更换nouce进行尝试,直到凑出前面若干比特都是0的散列值,才能够满足规定。

 

在创建交易时运用的数字签名技术中,也使用了单向散列函数。首先通过单向散列函数计算出消息的散列值,然后再对这个散列值施加数字签名。

 

 

除了数字加密货币,单向散列函数在我们实际生活中也经常用到。例如,检测软件是否被篡改,基于口令的加密,构造消息认证码来检测并防止通信过程中的错误、篡改以及伪装,进行数字签名,构造伪随机数生成器,构造一次性口令用于服务器对客户端的合法性认证等。

猜你喜欢

转载自blog.csdn.net/triaslab/article/details/84571012