md5还有存在的意义吗 (怎么规避md5)

一头活蹦乱跳的牦牛被加工成一包包牛肉干,这个就是一次MD5操作。在加工过程中,N多身体部位有损失,故无法通过牛肉干复原出一头牦牛。。。

md5是不可逆的为什么也能解密,如何看md5是否正确

MD5算法

MD5计算,对原始消息(Message)有损的压缩计算,无论消息(输入值)的长度字节是多少,是1亿字节、1个字节、还是0个字节,都会生成一个固定长度(128位/16字节)的消息摘要(输出值)

l 不可逆

在不知道原始消息的前提下,是无法凭借16个字节的消息摘要(Message Digest),还原出原始的消息的。请问各位同学:

Message Digest = ‘06f636b7a1f0b8b685540ab5434d0cc5’

这个消息摘要,其原始消息是什么?

其实,原始消息是以下长长的字符串:

‘8wewef390f0uhrnffeeewer2r1398sdsuhdqwwue2342ifwssqwwy88hd893hsxadqwd3kd0u31rnde2eqhwhqior2`9e9e7asde2’

l 单向性

但是如果告诉你们这个原始消息,算法是MD5,迭代次数=1,你们一样可以得到一摸一样的消息摘要(Message Digest)。

l 恒定性

如果各位同学计算出的消息摘要,与我计算的不一样,那肯定是使用一个假的MD5工具。因为无法满足,当原始消息恒定时,每次运行MD5产生的消息摘要都是恒定不变的,无论是你、我、他来计算,结果都应该是一摸一样的。

l 不可预测性

让我们再来做一次游戏,将原始消息的最后一个数字‘2’,修改成‘1’,如下所示:

8wewef390f0uhrnffeeewer2r1398sdsuhdqwwue2342ifwssqwwy88hd893hsxadqwd3kd0u31rnde2eqhwhqior2`9e9e7asde1 ’

产生的消息摘要,是不是和‘06f636b7a1f0b8b685540ab5434d0cc5’很相似呢?

让大家失望了,产生的消息摘要没有一丝一毫的关联性,新的消息摘要如下所示:

‘ e7cdaf219b3bbaa49db252677f95dec6’

现实的问题来了,MD5究竟有什么用?

用处太多了,数据完整性校验、数字签名、文件完整性检查、密码保存等等,随机挑一个密码保存来简单描述一下。

密码保存

md5是不可逆的为什么也能解密,如何看md5是否正确

无盐的MD5

大型网站需要保存千万万用户的密码,如果明文保存,万一哪天被数据库被攻破了,用户密码全泄密了。

如果数据库只保存用户密码的MD5消息摘要,那么即使黑客拿到了用户们的MD5消息摘要,也无法复原出用户的密码。

有同学会抗议,这个说法不对!黑客使用彩虹表可以将用户密码复原出,网站常用的密码一般也就6-10位,这个取值空间还是很好破解的。没错,但是可以加盐啊,提高破解的难度。

加盐的MD5

密码 + 用户名(盐)做为输入参数(原始消息),那么市面上的彩虹表一律作废,因为它们都没有加盐。

现代计算机的计算速度越来越快,丝毫挡不住黑客重新加盐彩虹表的破解。这不是危言耸听,这就是当前的现状。

如何应对呢?

将MD5迭代次数大大提高,10000次够不够挫败黑客加盐的彩虹表的破解?不够!那就加到50000次够不够,不够咱再加。

杀敌1000,自伤800,迭代次数是一把双刃剑。移动终端计算几万次的MD5运算,要消耗大量的CPU,至少有几十毫秒的计算时间,一旦迭代次数再上一个数量级,那延迟也要再上一个数量级。差不多就可以了。

还有一个办法,采用隐式的盐,如果各位同学有兴趣看,可以稍后再更新。