1.什么是MD5?
??MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
2.MD5真的安全么?
??了解MD5的都知道,它是不可能逆的,即我们没办法把MD5码还原对应的原文。道理很简单,任意长度的数据经过MD5处理后,所包含的信息量已经大大减少。要是可以还原的话,那MD5岂不是成为压缩算法??所以这里就会给很多人造成误解,以为不可逆就是不可破解,的确,复杂些的密码在一些MD5在线破解网站是破解不了的,相对来说是安全的。可是,针对一个有安全隐患的问题来说,相对安全就是不安全。随着科学技术水平的提升,MD5已经越来越不安全了!!!正如其网站公告所说:
3.MD5如何被破解?
??有很多种方法可以破解,不过需要明确一点,这里所谓的破解,并非把摘要还原成原文。为什么呢?因为固定128位的摘要是有穷的,而原文数量是无穷的,每一个摘要都可以由若干个原文通过Hash得到。
??对于MD5的破解,实际上都属于【碰撞】。比如原文A通过MD5可以生成摘要M,我们并不需要把X还原成A,只需要找到原文B,生成同样的摘要M即可。
设MD5的哈希函数是H(X),那么:
H(A) = M
H(B) = M
任意一个B即为破解结果。
B有可能等于A,也可能不等于A。
用一个形象的说法,A和B的MD5结果“殊途同归”。
??MD5碰撞通常用于登陆密码的破解。应用系统的数据库中存储的用户密码通常都是原密码的MD5哈希值,每当用户登录时,验签过程如下:
??如果我们得到了用户ABC的密码哈希值E10ADC3949BA59ABBE56E057F20F883E,并不需要还原出原密码123456,只需要“碰撞”出另一个原文654321(只是举例)即可。登录时,完全可以使用654321作为登陆密码,欺骗过应用系统的验签。
4.怎么防止MD5被破解?
??看完第3点你就知道了,MD5不够安全,但是如果你对它一往情深,只想用MD5的话,不妨可以试下以下做法:
-
多重加密 ??所谓的多重加密,顾名思义,就是把你要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以后,在线破解网站就匹配不上了,但是,匹配不上就不代表足够安全喔,只是不容易被轻易破解(因为第二次要破解的原文是一个32位的数字字母的结合,以此类推),增加破解的时间成本而已! -
加盐加密 ??比如Java中的Md5Crypt.apr1Crypt("要加密的密文","自定义盐值") ,可以多重使用,自定掂量! -
使用复杂密码(包含数字英文小数点等) ??经过反复测试,使用复杂的密码也能降低被破解的风险,这也是现在很多软件系统都强制用户的密码不能低于16位数,且应包含数字英文小数点等的原因。 -
不要在网站中显示密码列,哪怕是加密后回显的,也不可取! ??这一点很多初级开发者很容易犯错,在页面数据表格中绑定密码列给用户看,可能只是单纯的展示数据,却忽视了密码这一点容易被攻破的风险。比如下面这种情况,直接在表单回显密码,虽然是不可编辑和加密的状态,但是同样可以进行破解,这点你随便找个有经验的前端开发者应该都会。
谨记:(没有最好,只有更好)
??虽然MD5无法解密,但是可以碰撞出来,有库就行,对于单机来说,暴力枚举法的时间成本很高,字典法的空间成本很高。但是利用分布式计算和分布式存储,仍然可以有效破解MD5算法。因此这两种方法同样被黑客们广泛使用。
|