无所不在的哈希算法
Posted 未来狂想曲
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无所不在的哈希算法相关的知识,希望对你有一定的参考价值。
前言:区块链中 Hash、哈希、散列、SHA-256,一个接着一个的名词令人眼花缭乱,目不暇接。
什么是哈希?
Hash Algorithm 哈希算法,也称散列算法,该算法会将任意长度的原始数据压缩为一个固定长度的数字指纹(因为是从目标数据中按位提取的摘要信息,与每一字符都相关,就像人的指纹一样,有的时候也被称为数字摘要,切记与数字签名不是一回事);
图片源于微博
比如有一段文字,经过 SHA-256 哈希之后,结果为:
75a67a862df91ce054a257f1ed92726b617262b59f89dd4b5e70a403dd1c7e57
SHA-256 不应该是生成 256 位的 bit 吗,为什么是 64 位的字母+数字的串呢?
SHA-256 是生成的 256 位二进制,
比如:0000111010111000011000111100011110001101101000111110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
因为 256 位二进制有点太长了,而 1 位十六进制可对应 4 位二进制,SO,我们看到的都是 64 位的十六进制的。
所以,鬼知道这 64 位乱码背后的原始数据是什么(Hash 算法是单向算法(one-way),,这也是哈希算法的一大特点:逆向困难)。
哈希算法的特点
优秀的哈希算法需具备如下特点,分别来看一下:
1. 正向快速:
在有限时间内,能很快计算出结果(并且在任何一台计算机上 Hash 结果完全一样);
2. 逆向困难:
任何数据哈希的结果都毫无规律可言,拿到输出结果都难以逆向取到原始数据(目前还未有算法可以实现逆向还原原始数据,理论上无法破解);
3. 输入敏感:
由于 Hash 值与原始数据中的每一个字节都相关,即更改原始数据中的任何一个字符都会产生完全不同的哈希结果。
例如我们在上面那句话后面仅仅增加一个数字 1,其 Hash 结果值就发生巨变,可以看的出来,与之前的结果毫无关联,Hash 结果为:
939145eb12d5778f6a0e7961a878ea026e1b700f30093ae335e532739ad571a5
4. 冲突避免/抗碰撞性:
很难找到任意两个数据,使其 Hash 结果相同,也可以说可能性微乎其微;
关于第 4 点需要着重说明一下:
碰撞(Collision),碰撞即意味着即两个不同的输入(Message)产生了相同的 Hash 结果(Hash Value)。
这是因为输入是无穷多的,而输出则是有限的,比如 SHA-256 的输出结果永远为 256 位(与输入的长度无关),理论上来讲是会出现不同输入产生一样的 Hash 结果输出的(输入>输出)。
常用的哈希算法有哪些
SHA
安全散列算法(Secure Hash Algorithm)的缩写,是一个密码散列函数家族。这一组函数是由美国国家安全局(NSA)设计,美国国家标准与技术研究院(NIST) 发布的,主要适用于数字签名标准。
SHA-1
输出 160 位的 Hash 值,现被证明不具备“强抗碰撞性”;2017 年 2 月,CWI 和 Google 的研究人员找到了一例 SHA-1 碰撞,发生碰撞的是两个真实的、可阅读的 PDF 文件。这两个 PDF 文件内容不相同,但 SHA1 值完全一样。
SHA-2
输出值为 256 位的 Hash 值,其下又可再分为六个不同的算法标准,包括:SHA-224、SHA-256(比特币使用的是该算法)、SHA-384、SHA-512、SHA-512/224、SHA-512/256(SHA-3 算法已于 2015 年提出)。
MD5
MD 是 Message Digest 缩写,是美国密码学家 Ronald Linn Rivest 于 1991 年在 MD4 的算法基础上提出的,其输出为 128 位,MD5 现已被证明不具备“强抗碰撞性”;
哈希算法的应用场景
比如在区块链中,都会包含有当前区块的 Hash 与前一区块 Hash ,Hash 在这里有着至关重要的作用。
图片源于 Youtube
区块通过前一区块 Hash 能使所有区块首尾连接在一起,一旦一个区块的值被篡改了,其后续所有区块都将发生变化,你不得不重新计算所有后续区块的工作量证明,所有人都知道 PoW 工作量证明有多艰难()。
图片源于 Youtube
除了在区块链中使用,我们身边也有不少例子,比如检测下载的软件是否被篡改:
图片源于网络
通过对比两个 Hash 结果值,能够确认下载的内容是否被篡改了(需要注意, Hash 无法辨别伪造)。
又或者网站的数据库在存储用户登陆密码时,都经过一次 Hash,比如用户密码是 67890,数据存储为 Hash(67890)的结果值,这样当别有用心的人即使拿到数据库权限后,也拿不到明文的密码,还是比较安全的。
但是,他们有可能会建立一个彩虹表(彩虹表是一个用于 Hash 函数逆运算的预先计算好的表),然后通过反查比对的方式来完成破解,目前来看,这种方法无解。
事实上,严格意义来讲,Hash 算法不能称为是加密算法,加密意味着得有解密,而 Hash 是不用解密的,是为无法破解为目的而设计的。
OK,那么问题来了。
以上是关于无所不在的哈希算法的主要内容,如果未能解决你的问题,请参考以下文章