关于MD5加密算法密码验证问题
(恰恰我最近也在研究加密这块,
我们公司项目的RSA ASE MD5 SHA-1加密方案都是我写的。
直接拿我分享会上的稿子了)
先回答你的问题:
你的担心是正确的,
MD5加密的结果值A,是可以由两个不同的内容B和C得到的
即:期望的正确密码 a a进行MD5加密的结果 0cc175b9c0f1b6a831c399e269772661
某人输入了错误的密码x,
x进行特殊的算法处理,是可以得到0cc175b9c0f1b6a831c399e269772661 这个MD5值的
————
但是你注意一点,错误的密码数据,必须是通过复杂算法得到,简单点称作“碰撞算法”。碰撞算法,其实可以看作是一种伪装算法,即,把错误的东西伪装成某个正确东西的MD5值。
至于“碰撞算法”的原理,可以从MD5加密的原理探知1、2,
MD5加密的过程有四步骤:
填充 2.初始化变量 3. 处理分组数据 4.输出结果
“碰撞算法”原理就是在前三步进行“大数据量样本的填充-试错-填充试错-直至得到期望的结果
破解过程中有三点是必须清晰的;
1.大量的正确密码的样本
2.采用碰撞算法
3.事先预知的,破解者期望的正确的结果
三者缺一不可
MD5“碰撞算法”的示例场景也是在 文件(比如数字签名)摘要加密上,
即,像密码学家演示的那样:
通过算法,可以得到相同MD5值的A和B (A和B只是代指),这种算法2004年已经由中国的密码学家王小云实现。
但是回到题主担心的,
非法分子,事先并不知道 张无忌的账号——正确密码对应的MD5值,
他只能用“碰撞算法”去试,随便编一个假的密码,用“碰撞算法”去进行伪装填充-试错
但是试的过程就是无数次跟贵公司后台校验的过程,
在这个过程,贵公司后台应该做了用户当日最大错误密码次数处理。
所以理论上,不存在一个人,输入了错误的密码,登录成功的情况。
假设这个人每天能试5次,使用“碰撞算法”估计要算好几辈子了。
——
但是强调一下“MD5碰撞算法”的应用前提:
已知的明文以及明文对应的MD5值
根据1的条件,算法可以伪装出 另一个明文以及相同的MD5值
所以,不存在偶尔输错了一个密码,使用MD5加密,凑巧得到了正确密码的MD5值,这种情况不满足“碰撞算法”的条件和前提。
根本不可能。
安全性总结:
对于文件来说碰撞可能容易,但是对于限定长度的密码或者密文来说,MD5作为一种高性能高安全的数字签名算法来说,还是非常实用的
——
综上 MD5碰撞几个关注点
多数情况下,会产生不可视字符,而密码不可能存在不可视字符的.
生成"碰撞"的字符,能和你密码本身长度相等的.基本不可能.
基于上面两点.只要稍作点文章.就可以防止MD5碰撞了.
1.密码进行多次MD5加密
2.密码过滤不过视字符.
3.密码是定长的.例如:32个字符.用户不够的字符,用一固定字符如:空格补充.超长的.一律非法.
————
参考文章
【1】中国密码学家王小云2004年提交的破解MD5的算法
【2】碰撞算法原理分析
【3】产生MD5碰撞的新的充分条件集
【4】MD5碰撞