用MD5保存密码的安全防范

  两个不同的且均可正常运行的exe程序文件,具有相同的MD5校验值,这不仅仅是理论上的可能,而是现实,已经有人写出了这样的两个程序了,http://www.mathstat.dal.ca/~selinger/md5collision/这个网址可以下载。
  我所知的MD5应用最普遍的是在两个方面,一个是文件签名(多用于文件下载等),一个是密码保存。
  MD5算法在保存密码方面应用非常广泛,许多流行的应用系统都用它来保存密码信息。如果你的系统里也用MD5保存敏感数据的“指纹”,那么要考虑变换一下花样,否则将有重大的安全隐患。不是危言耸听,现在在一台普通家用电脑上,几秒钟就可以根据MD5结果反向计算出一个原文,已经有这样的工具下载,这种工具称作MD5碰撞计算器。也有一些网站能够提供字典式的MD5反查,印象中好像是10位长度以内的字母数字组合的MD5都可以反查到。


  关于MD5碰撞,据说是山东大学王小云教授的一篇报告震惊国际密码学界,他找到了一种能够比较快速的计算MD5碰撞的算法。(最早我听到这个报道的时候还以为是忽悠呢,俺中国人被忽悠怕了落下的后遗症:D,后来看到实实在在的例子和程序了才确信)
  何为MD5碰撞呢?就是说,存在并能够找到两个或两个以上的不同数据(D1,D2…Dn)进行MD5摘要运算后具有相同结果。来看一个比较著名的例子:

(数据1)
d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89
55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

(数据2)
d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89
55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b
d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0
e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70


  这两组256位字符串的数据有6个位置的字符不同(红色标示部分),
但是都具有相同的MD5值:79054025255fb1a26e4bc422aef54eb4.

  也就是说,如果你的用户系统以MD5保存密码,如果某个帐号的密码MD5结果是79054025255fb1a26e4bc422aef54eb4,那么真实的密码可能是数据1,有可能是数据2,虽然我们常见的系统不会把密码设的这么长,但是不排除存在更短的MD5碰撞的可能性。

  说到正题上来。如果我们系统的用户帐号表的数据被坏人盗窃了(特别是网站常用的MDB数据库文件经常有被盗下载的),坏人根据表中的MD5值就能够计算出一个密码而登录我们的系统,这无疑是一个安全隐患,如何在不大动干戈的情况下防范这一隐患呢?说说我的看法。


  1、检测输入的密码长度,比如32位以内或20位以内,根据实际情况。超出长度范围直接判断为密码错误。

  2、检测输入的密码是否为键盘字符,否则可能是伪造的密码。

  3、变换花样,防止直接通过字典反查。通常用户的密码可能设置的比较短,如果直接保存该短字符串的MD5值,无疑是很容易被查出来的。利于越长数据越不容易被字典查出的道理,我们可以在程序中,以原密码的基础上构造一个较长的密码,比如原密码加上比较长的自定义前缀、后缀、或其他变换算法,总之呢要得到一个较长的字符串(建议至少弄到50字符以上),再MD5结果存入数据库。验证密码的时候也是相同步骤。这样就大大降低了被字典反查的可能性。怎么算,就充分发挥你的想像力了。(雅虎网站的密码就是这么处理的,好像是加了十几个字符的串)


  如果做到了以上3点,我们系统的MD5安全性就大大提升了。

 

附几个MD5相关网址:
http://www.cmd5.com/
http://www.md5.com.cn/
http://www.md5crack.com/
http://www.mathstat.dal.ca/~selinger/md5collision/

 

你可能感兴趣的:(MD5)