MD5消息摘要算法和SHA-1 安全散列算法
MD5和SHA-1都是我们耳熟能详的术语了,很多人可能知道他们跟加密有关系,但是他们是怎么做到加密的,他们各自的特点又是什么。我来简单的讲一讲。MD5和SHA-1都被称作哈希(Hash)函数:R=H(S)。用过Java语言的人对这个术语应该相当熟悉。
Java类库里的Object类定义了hashCode这个函数,但是java的概念略有不同。正式的哈希函数的定义是“把任意长度的数据计算成固定长度的数据(几乎是唯一的)”。也就是说函数的输入是任意长的,输出总是固定长度的。
MD5和SHA-1是两种加密用哈希函数,MD5的返回值总是128bit(16Bytes),或64bit(8Bytes)的, SHA-1的返回值是160bit(20Bytes),都是固定长度。MD5如果按十六进制表示的话是32位十六进制的数,SHA-1是40位十六进制的数。
那么两个函数为什么可以用在加密上呢?
因为他们都有这几个特性
1、都是“不可逆”的函数。
不存在一个算法能够由哈希值倒算出原始信息。 对原始信息的任何一点改变都会导致结果的哈希值巨大的不同。
举个例子,假如原始数据是几百万字的文章,你在其中哪怕改动一个标点,计算出的哈希值都会有很大的变化。
2、运算代价是相对较低的。
普通的AMDOpteron 2.2GHz的芯片,每秒可以计算出335MB数据的MD5值,可以计算192MB数据的SHA-1值。
参见https://en.wikipedia.org/wiki/SHA-1#Comparison_of_SHA_functions。
类似于1,除非通过蛮力的 穷举法 (举例:6位数密码:则000000 - 999999匹配),否则无法找到两段不同的信息而有相同的哈希值。(这一点现在已被证明是不成立的了,请看后文)3、那么这两个函数的特点在哪里呢?特点在于都能“通过哈希值唯一标识原信息”。
这个怎么讲,就是比如原始信息是A,我知道原始信息的哈希值Ha,如果我有另一段信息,这段信息的哈希值也是Ha的话,我就能“以极大的可靠性”断定这另一段信息就是A。也就是说哈希值能“唯一”标识原始信息。原因是什么呢?
曾经(在2005年之前),这两个哈希函数被认为是很好的Message Digest(信息摘要)函数,它们的返回值能够“唯一”标识原始信息,而在2005年,中国山东大学的王小云教授的惊天动地的发现颠覆了这一国际加密学的基础。详情请看我后续文章。