MD5是加密算法吗?


最近各种暴库,各种明文密码,各种专家写了一篇又一篇分析文章,甚至有无知的网站站长说自家的存储用户密码是经过MD5“加密”的而非明文,所以是安全的。在学习更复杂深奥的密码学理论之前,我们还是首先来清理一下基本概念。

MD5的作用不是加密,不是加密算法!

MD5,是Message Digest 5的缩写,是一种散列算法,又称为摘要算法或哈希(Hash)算法。MD5由其前身MD4改进而来,与其同属一类的算法还有SHA-1等。MD5算法的作用是将不定长的数据经过与、或、非、异或、移位、模幂等运算,产生定长的数据输出,称为散列值。通常情况下,不同的输入得到不同的散列值。优秀的散列算法即使输入差别甚微,都会导致输出大为不同,称为“雪崩效应”。散列算法常与公钥密码体制的加密算法共同使用,以检验数据的完整性。

与加密算法不同的是散列算法没有密钥,并且是单向的,即不能由正向的散列过程推到出逆向的“还原过程”。容易混淆的一点是人们认为加密就是把有具体意义的明文转换成没有意义的密文,这样看来,MD5“确实”是一种“加密算法”。然而对数据加密的目的还不仅于此,不但要让非接收方不能轻易得到明文,还要让接收方有快速的方法得到明文,即为解密。解密和破解是两个概念,解密(decryption)是加密的逆向算法,接收方已知解密密钥,使用解密算法计算得到明文;破解(crack)是在不知道密钥的情况下,采用概率统计、差分分析、暴力尝试等方法得到明文。将MD5值还原成散列前的值只能称为破解,而非解密。

现代密码学将密码体制分为两种,对称密码体制和非对称密码体制(公开密钥加密体制)。MD5不属于两者的任何一种密码体制,不能仅依靠MD5等散列算法进行保密通信。

王小云不是找到了MD5算法的逆向算法

如上文所提及的,通常情况下,不同的输入得到不同的散列值。然而存在一种情况是不同的输入却得到了相同的散列值,称之为“碰撞”。尽管优秀的散列算法应当极力避免碰撞的出现,但理论上是不能完全避免的,所以MD5和SHA-1等散列算法中存在碰撞。山东大学的王小云教授提出了一种比较快的找到碰撞的方法,而不是研究出了任何MD5值都可以被逆的逆向算法,MD5算法仍然是不可逆的。

网上有许多破解MD5值的网站,多是通过正向计算消息值的MD5值,制表存于数据库中,供用户反查。这样的库已经非常庞大,无论是常见的或是不常见的,都可以通过MD5值查到其原始消息,极其鲜见的也可以通过分布式计算在有限的时间内计算出。所以,网站存储仅由MD5散列过的用户密码,一旦泄漏仍然是不安全的。

最后,我想起了大三是网络安全课的老师freebird_007告诫我们的一句话,科班出身的学生就是需要专业,专业地说话,专业地做事。

(我时常思考加密和编码本质的联系是什么;散列算法能不能称为“广义的加密算法”呢,但目前我仍然坚持严格的定义。)

  1. #1 by INNOCENT on 2011 年 12 月 28 日 - 17:07

    如果加密算法的唯一用途是”加密和解密”, 那么md5, 作为一个hash函数, 那肯定不是加密算法了.

  2. #2 by viva on 2012 年 01 月 02 日 - 12:20

    亦或?

    • #3 by mazhechao on 2012 年 01 月 02 日 - 12:30

      已更正。谢谢。

(will not be published)

Are you a human?