先举个例子。
生活在世上的每个人,为了参与各种社会活动,都要设定一个识别自己的标志。名字或身份证虽然能证明你这个人,但这种代表性非常脆弱,因为重名的人很多,身份证还能伪造。最可靠的办法就是,将一个人的所有基因序列记录下来,但这样做并不实际;指纹看上去也不错,但代价太高。
对于在互联网世界中传送的文件来说,如何标志文件的身份同样重要。比如,下载一个文件,在文件的下载过程中会经过很多网络服务器、路由器的中转,如何保证该文件就是我们需要的呢?我们既不可能对文件一一进行检测,也不能利用文件名、文件大小等容易伪装的信息,这时就要使用类似于指纹的标志来检查文件的可靠性,这种指纹就是现在所用的哈希算法。
哈希算法,又称杂凑算法、散列算法,是一种从任意文件中创造小数字“指纹”的方法,就是以较短的信息来保证文件的唯一性,这种标志与文件的每一字节都有关系,且无法找到逆向规律。因此,一旦原有文件发生改变,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件。
这种标志有何意义?上例的文件下载过程就是一个很好的例子。如今,为了提高文件的可靠性,多数网络部署和版本控制工具都在使用散列算法。同时,在使用文件系统同步、备份等工具时,使用散列算法来标志文件唯一性可以减少系统开销。
当然,作为一种指纹,哈希算法最重要的用途在于给证书、文档、密码等高安全系数的内容添加加密保护。此用途主要得益于哈希算法的不可逆性,具体体现在:用户不仅无法根据一段通过散列算法得到的指纹来获得原有文件,也不可能简单地创造一个文件并让它的指纹与一段目标指纹相一致。
目前,流行的哈希算法包括MD5、SHA-1和SHA-2。
1.MD5
MD5是Rivest于1991年对MD4的改进版本。MD4(RFC1320)由麻省理工学院的罗纳德·L·里德斯在1990年设计,MD是Message Digest的缩写,输出为128位。MD4不够安全,MD5对输入以512位进行分组,输出128位。MD5比MD4复杂一些,计算速度慢一点,但是更安全。
2.SHA-1
SHA(Secure Hash Algorithm)是一个哈希函数族,由美国国家标准与技术研究院(National Institute of Standards and Technology,简称NIST)于1993年发布第一个算法。1995年知名的SHA-1面世,输出长度为160位的哈希值,抗穷举性更好。设计SHA-1时,使用的原理跟MD4相同,还模仿了该算法。
3.SHA-2
为了提高安全性,美国国家标准与技术研究院设计出了SHA-224、SHA-256、SHA-384和SHA-512算法,统称为SHA-2,跟SHA-1算法原理类似。
一个优秀的哈希算法,能够实现这些目标:一是正向快速。只要给定明文和哈希算法,就能在有限时间和有限资源内计算出哈希值。二是逆向困难。只要给定(若干)哈希值,在有限时间内很难(基本不可能)逆推出明文。三是输入敏感。原始输入信息只要修改一点内容,产生的哈希值就会有很大不同。四是避免冲突。对于任意两个不同的数据块,其哈希值相同的可能性极小;对于一个给定的数据块,找到跟它的哈希值相同的数据块非常困难。可是,在不同的使用场景中,对某些特点会有所侧重。