MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的16进制数字串)。
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的MD5“数字指纹”,如果任何人对文件做了任何改动,其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碰撞
MD5跟之前Rijndael算法差不多,不过在Web中传递数据应用很常见,安全性很高,它是一个不可逆的字符串变换算法,不过被山东大学的王小云教授破解了。然后再AB包里当做核对数据完整性。
看一看.Net官网怎么写的,官方是创建32个字节的十六进制格式的哈希字符串,然后我又稍加修改
测试
再加上一条
个人想法可能是这个套路使用MD5码,因为他是唯一的无法反转,然后注册时候服务器只存这个被MD5码处理后的密码,然后每次登录都用MD5码处理然后再服务器校对,这样可以保证的是公司不知道玩家的密码,但是可以去验证,保证了玩家的密码数据安全。
md5算法的特点如下:
1、长度固定。无论输入多少字节的信息,输出的字节总是16字节。
2、结果不可逆。从结果无法反推原始数据,因为无论输入的信息是多少字节,输出总是16字节。
3、高度离散性
输出的16个字节数据,没有任何规律可言。假如两次的输入只改变一个位,输出的结果也完全不同。
4.抗碰撞性、两个不同的数据,想产生的MD5一致,是十分困难的。
一个比较复杂的数学运算
Rivest在1989年开发出MD2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是16的倍数。然后,以一个16位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,Rogier和Chauvaud发现如果忽略了检验将和MD2产生冲突。MD2算法加密后结果是唯一的-----即没有重复。
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
有兴趣的话,看下这个