密码学之MD5

对于广大Coder、SA等IT人士来说,密码学是一个很常见的词语。我们对重要数据进行加密处理,我们对登陆用户密码进行验证,我们……加解密是我们日常工作的一个重要组成部分。简单来讲,密码学是研究如何隐密地传递信息的学科,其中有一个用途广泛的算法我们不得不提,那就是MD5。

MD5诞生已经有20余年,经历无数次的质疑与攻击后仍然坚挺,它简直是一个接近完美的算法。

为何说MD5是接近完美而非完美?大家第一时间想到的或许是王小云教授。但王教授的方法显然不能称为破解,因为她只是在知道原文的情况下找碰撞而已。而破解是什么?破解是给出复杂算法的一个反函数,对MD5来说即拿到任何一个MD5值均能解出原文。幸运的是,这种情况并不会发生,因为MD5是用散列函数求解的,运算过程只是抽取到原文的一部分信息且加以重组,所以试图用一个32位16进制数去求解一个可能任意长度的字符串无疑是天方夜谭。可以看出,MD5是一个不可逆的算法,并且严格符合雪崩效应,仅仅是知道原文的情况下去理论上能找到碰撞这一瑕疵而已,所以说MD5是一个接近完美的算法。

如果因为MD5因为有瑕疵导致你对MD5存在疑虑的话,那么你可以对其进行复杂处理来给自己增强信心。处理方法很多,比如用户登陆的密码,你存储用户密码的时候肯定是存的MD5值,毕竟涉及用户隐私。但是用户的密码通常来说是相对简单的,一般都是10位左右,直接生成MD5值的话如果数据库被泄露那么很难经受住上面所说的穷举法暴力破解攻击的;这时候如何处理呢?那就是加盐,并且这个盐不能简单到几位纯数字或字母。如果一些非常机密的信息需要加密的话,也可以采用复合算法进行处理,即可以使用两种或两种以上的加密算法一起使用。比如可以先用MD5对原文进行处理,然后用sha-1对原文进行处理,两个处理结果再进行一次sha-1或md5,那么这时候就算是找碰撞也是极其有难度,概率上可以称为不可能发生事件。

当然,碰撞无疑是存在的,那怕是MD5、sha-1综合起来使用,这为伪造密文提供了可能。但是我们知道,密码学强调一个信息的时效性,也就是说信息仅在一定时间段内对决策具有价值。所以哪怕你用穷举法去为MD5找原文,对复杂的原文来说是无法找到的,因为MD5是对原文抽样处理,仅仅是一个摘要;对于稍微简单(比如长度小于32位)原文的MD5值来说,如果需要几百年甚至是几万亿年的话,那么这无疑也是安全的,因为这些信息在若干年后已经没有价值,就算找到原文也对信息拥有者来说无任何决策价值。

总之,MD5对绝大多数的使用者来说,在未来很长一段时间内都是非常安全的,可能是10年、20年、甚至是50年;唯一遗憾的是密码学的发展如此缓慢,以至于目前仍未找到革MD5命的算法。

作者:忆辛,2014年11月25日写于羊城

相关推荐