在介绍单向散列函数之前,我们先了解一下什么情况下需要使用到单向散列函数。
如果你需要从国外的网站上下载一个软件,但是因为种种原因,国外的网络太慢了,下载几个G的数据几乎是不可能的。刚好国内有镜像网站,可以从国内下载数据。但是如何保证国内的镜像不是被篡改过后的呢?这个时候就需要单向散列函数了。一般来说网站会提供MD5或者SHA的值作为验证值。
单向散列函数有一个输入和输出。输入称为消息,输出称为散列值。
散列值的长度跟消息的长度无关,不论多少大小的长度的消息,都会计算出固定长度的散列值。
单向散列函数具有下面几个特性:
单向散列函数有很多实现方式,你甚至可以自己写一个。常见的如MD4,MD5, MD(Message Digest)是消息摘要的缩写。
MD4和MD5是由Rivest在1990年设计的,现在已经不再安全了。
SHA-1 是由NIST设计的一种能够产生160比特散列值的单向散列函数。现在已经不推荐使用。
SHA-256, SHA-384, SHA-512同样是由NIST设计的单向散列函数,他们的散列长度分别是256,384,512比特。这几种单向散列函数统称为SHA-2。
SHA-1已经在2005年被攻破了。
SHA-3是在2005年SHA-1被攻破的背景下开始制定的,SHA-3是通过公开竞争的方法选拔出来的,最终被选中的算法叫做Keccak算法。
单向散列算法最后的hash值是有固定长度的,所以只要我们愿意,总是可以不断的重试,从而找到两个相同的hash值。
更多教程请参考 flydean的博客