您现在的位置: 哈希区块链 > 哈希交流群 > 区块链中的数学知识之HASH算法

区块链中的数学知识之HASH算法

来源:哈希交流群  热度:   时间:2022-05-15 08:40
哈希算法(hash) 任意长度的二进制值(明文) 映射为较短的固定长度的二进制值(hash值) ,并且不同的明文很难映射为相同的hash值。 例如:计算一段话csdn网站真是好好啊的 md5 ha...
区块链中的数学知识之HASH算法
哈希算法(hash)
 
任意长度的二进制值(明文) 映射为较短的固定长度的二进制值(hash值) ,并且不同的明文很难映射为相同的hash值。
 
例如:计算一段话“csdn网站真是好好啊”的 md5 hash 值为:
 
    10012549883a2ef85dc81b90fb606046 #这个值是假设,还没有论证过
 
 
 
哈希函数具有输入敏感特性。也就是说,如果输入数据发生微小改变——比如改一个字符,那么输出将发生很大的变化。这带来两点好处:第一,你无法通过输出的变化,来推测输入发生了什么变化。第二,保存哈希值可以验证数据是否被篡改。一般的,hash算法都是算力敏感型,意味着计算资源是瓶颈,主频越高的CPU进行 hash 的速度也越快。也有一些hash算法不是算力敏感的,例如scrypt,需要大量的内存资源,节点不能通过简单的增加更多 CPU 来获得 hash 性能的提升。
 
注:MD5是一个经典的hash算法,其和SHA-1算法都已被证明安全性不足应用于商业场景。为了提高安全性,NIST NSA 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512算法(统称为SHA-2) ,跟SHA-1算法原理类似。比特币使用的是 SHA256。
 
 
所以一个优秀的hash算法,需要冲突避免,即很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
 
例如:文字"version1" 和"version2" 进行MD5 HASH后二者的MD5值就天差地别了
 
"version1"的MD5 HASH值为 "966634ebf2fc135707d6753692bf4b1e";
 
"version2"的MD5 HASH值为 "2e0e95285f08a07dea17e7ee111b21c8";
 
但是还有一种可能
 
1、"0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc94
 
2feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef"
 
2、"0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc94
 
2feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef"
 
上面这两段文字只有红色加大的数字不同,但是MD5 HASH后的值如下:
 
1、cee9a457e790cf20d4bdaa6d69f01e41
 
2、cee9a457e790cf20d4bdaa6d69f01e41
 
这个就是碰撞案例,像这种案例很多,现在的计算机只要数秒就能找到MD5的一个碰撞案例,因此,MD5在数年前就已经不被推荐作为应用中的散列算法方案,取代它的是SHA家族算法,也就是安全散列算法(Secure Hash Algorithm,缩写为SHA)。
 
安全散列算法与MD5算法本质上的算法是类似的,但安全性要领先很多——这种领先型更多的表现在碰撞攻击的时间开销更大,当然相对应的计算时间也会慢一点。SHA家族算法的种类很多,有SHA0、SHA1、SHA256、SHA384等等。其中SHA1是现在用途最广泛的一种算法,但是在2017年2月破灭了,谷歌宣布实现了 SHA-1 碰撞。所以对于一些大的商业机构来说, MD5 和 SHA1 已经不够安全,推荐至少使用 SHA2-256 算法。