MD5 的误解

  • md5 加密
  • md5 后可以反吗?
  • md5 被破解了?

很多新手程序员对 MD5 算法产生以上的误解,主要原因都是没理解 MD5 的用处,先看看 MD5 在 Wikipedia 上的定义

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

注意几个关键词,消息摘要算法128位(16字节)确保信息传输一致,那么产生以上误解的原因就是,错误的将 MD5 用于加密。

在 WEB 时代初期,用户注册后的密码以明文存储在数据库中,一旦数据库泄露,后果非常严重,于是就有人将密码 md5 后的值存在数据库中,登录时将用户输入的密码 md5 后与数据库的密码进行比对,于是一些新手程序员依葫芦画瓢,并没有理解其用意,错误的将 MD5 理解成了一种加密算法。

既然是加密算法,那就会顺理成章的想怎么解密,有部分程序员就会使用 MD5 不可逆的特性来反驳,那其实也是牛头不对马嘴,MD5 就不是加密算法,哪里会有什么解密呢。

还有一个错误的理解就是 MD5 被破解了,网上有很多现成的工具,可以根据 MD5 生成的散列值,还原出原字符串,其实大多是采用了彩虹表

彩虹表是一个用于加密散列函数逆运算的预先计算好的表, 常用于破解加密过的密码散列。

简单说就是写一个方法,将所有可能输入的原字符串 md5 后存在数据表中,这样如果散列值正好与数据库中某一条记录一致,那么就相当于还原了字符串,那么真实情况是不是还原了呢,其实未必,想想看 md5 后的散列值只有128位(16字节),真实世界中有那么多字符组合,只用 128 位来表达,想想就知道,同一个散列值可能代表很多不一样的原始字符串 md5 后的结果,也就是即使在彩虹表种找到了一致的散步列值,也不可能知道原始字符串。

而 MD5 的真正缺陷在于

1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-1。
2004年,证实MD5算法无法防止碰撞,因此无法适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
2009年谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。

现在编程中 MD5 用途最多的还是确保信息传输完整一致,也就是防篡改。