每个人都有个名字,比如张三、李四、王五,再不济也有个阿猫阿狗的称呼,虽然都有名字,但名字会重复,所以你必须得有身份证,不然你成了传说中的“黑户”,身份证就是能证明“你是谁”的唯一标识。 在互联网里,每个文件也必须有自己的唯一标识,用于文件的自我证明-“我就是我,不一样的烟火!” 而能点燃这场烟火的,正是哈希算法。
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,可将任意文件映射为较短的固定长度的字符串(即哈希值)。
计算机世界只认二进制,任意文件都是由“0”和“1”组成的,比如币乎的logo它在电脑中真实面目可能是:
001100010101110000101000001….
得有上万位吧,估计要写到下班才能写完,而将其哈希一下就得到了它的哈希值:e836e7bfcf8a2503524a9291a26c4b18083b91e4
简短而又精悍,如果图片是一个人,那么哈希值就是TA的DNA序列,不同的文件哈希值不同,同一个文件哈希值固定,如果你复制一份,它的哈希值并不会改变,与原件一样。因此,哈希值就是网络世界里文件的DNA编号,如果想给你的文件烙上DNA,就把它哈希一下吧!
一个优秀的哈希算法,具有以下特点:
(1)正向快速:给定明文和 hash 算法,在有限时间和有限资源内能快速计算出 hash 值。
对于一部20G的3D电影与一个5k的文档说明,哈希一下的时间几乎相同。
(2)不可逆向:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
很容易理解,就是说给你个DNA序列,你根本无法想象出他长什么样,你甚至无法分清他是人还是啥, 因为大猩猩的DNA和人的DNA相似度可达98%。
(3)输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来都有很大不同。
就如同你某天打开支付宝,突然发现账户上的余额小数点向后移了一位,你瞬间从10万的小资变为了百万的富翁。
(4)冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
这个概率小到什么程度呢?额…估计比中双色球大乐透还难吧!可万一真中了呢?那就是撞大运了,我们称之为哈希碰撞,越优秀的哈希算法,哈希碰撞的概率也越低。
目前流行的 Hash 算法包括 MD5、SHA-1 和 SHA-2。
(1)MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。其输出为 128 位。MD4 已证明不够安全。
(2)MD5(RFC 1321)是 Rivest 于1991年对 MD4 的改进版本。它对输入仍以 512 位分组,其输出是 128 位。MD5 比 MD4 复杂,并且计算速度要慢一点,更安全一些。MD5 已被证明不具备”强抗碰撞性”。
(3)SHA (Secure Hash Algorithm)是一个 Hash 函数族,由 NIST(National Institute of Standards and Technology)于 1993 年发布第一个算法。目前知名的 SHA-1 在 1995 年面世,它的输出为长度 160 位的 hash 值,因此抗穷举性更好。SHA-1 设计时基于和 MD4 相同原理,并且模仿了该算法。SHA-1 已被证明不具”强抗碰撞性”。
为了提高安全性,NIST 还设计出了 SHA-224、SHA-256、SHA-384,和 SHA-512 算法(统称为 SHA-2),跟 SHA-1 算法原理类似。SHA-3 相关算法也已被提出。
可以看出,上面这几种流行的算法,它们最重要的一点区别就是”强抗碰撞性”。
(1)哈希算法,就是可将任意二进制文件映射为固定长度字符串一种算法。
(2)哈希算法具有正向快速、不可逆向、输入敏感、避免冲突的特性。
(3)衡量哈希算法的好坏的一个重要因素就是“抗碰撞性”。