|
哈希算法也称散列算法,可以将任意长度的明文字符串映射成比较短的二进制串,且不同的明文串映射后的值几乎没有冲突。例如,将字符串“hello,world”通过常见的MD5哈希算法进行计算后可以得到哈希值“3CB95CFBE1035BCE8C448FCAF80FE7D9”。 哈希值又称为指纹或者摘要,因为它足够验证文件的完整性与正确性。例如,对“hello,world”稍加修改,使之变成“hello world”,那么经过MD5算法,哈希算法的计算得到的结果就会变成“5EB63BBBE01EEED093CB22BB8F5ACDC3”,与原先的摘要值截然不同。这是哈希函数的一个重要特性——如果哈希函数的输入是不同的,那么得到的哈希值输出在绝大多数情况下也是不同的。然后,由于哈希函数的输入和输出不可能是一对一的对应关系,那么必然存在着不同的输入有着相同的哈希值的情况,这种现象称为哈希碰撞,也称为哈希冲突。在哈希冲突的情况下,不同输入的哈希会产生相同的哈希值。 常见的哈希算法有MD5算法和SHA算法。 MD是Message Digest的缩写,其中,MD4由MIT的Ronald L. Rivest于1990年提出,现已被证明不安全。MD5是Rivest在1991年改进提出的,但后续也被证明会产生哈希冲突,即会有不同的明文的哈希值是重复的,足够说明该算法并不安全,所以现在人们日常的哈希过程并不会采用MD5算法。 SHA(Secure Hash Algorithm)是一个哈希算法系列,SHA1算法在1995年由美国国家安全局提出,随后SHA2系统的SHA224、SHA256、SHA384和SHA 512算法也陆续被美国国家安全局公布出来,到目前为止,MD5算法与SHA1算法已经被破解,被证明不再安全,在使用这类哈希算法时最起码要采用SHA2-256或者其他更安全的算法。 在区块链应用中,比特币采用了SHA2族的SHA2-256算法,通常也简称为SHA256算法。比特币在挖矿和生成地址的时候都采用了SHA256算法。而在以太坊中采用了SHA3哈希函数族的来源——keccak族的keccak256算法。 哈希函数本身是一种单射函数,所以,哈希的整个过程并不可逆,如果需要对明文数据进行隐藏和保密,则需要使用加解密算法。 【出处】郑子彬,陈伟利,郑沛霖.区块链原理与技术.清华大学出版社,2021年3月第1版.
|