小议MD5加密字符串的防破解技术11/08/2007
md5无疑是这个时代人们所最为津津乐道,最为常用的一项加密算法,其以加密强度颇大而著称,理论上通过穷举碰撞来猜解密文,得出原文,需要很强悍的计算机昼夜不停的工作N久才能完成,所以MD5算法的使用范围极为广泛~
然而,似乎自然界都遵循“枪打出头鸟”的原则,所以,在MD5流行的同时,人们也想出各种猜解手段来攻击MD5算法,例如:字典穷举、MD5crack,但其效率不高,成功率也很低,目前最有效的破解MD5算法的方法是查询,猜解的对象是针对会员密码!其原理就是将大量的口令收集起来,然后让他们与自己的MD5密文一一对应,需要的时候对其查询,得出原文,随着其收集数据量的增加,破解成功率是相当高!目前国内最大的专营此业务的网站是CMD5.COM
(http://www.cmd5.com/),其数据库号称已达4T,也就是 4*1024G,4000G的数据,换成电影的话(按800M一部)至少可以放5000部电影,按一天看10部的话,这些电影要超过一年半的时间才能从头到尾看一遍,还周末、国家法定节假日不休息!!!
哈哈,扯远了。本文要讨论的中心就是如何让这种破解方式也失效~好的,开工,在这之前我们必须明白,为什么MD5被破解,很大的原因是因为原文太短了,或者太“简单了”,诸如“123”,“abc”……,先来个实验:
动网默认的管理员密码是admin888,其MD5值是7fef6171469e80d32c0559f88b377245,放到cmd5.com上,不到1秒钟即出来原文!
好的,我们把7fef6171469e80d32c0559f88b377245再MD5一次,即md5(md5('admin888'));得到的值是0b77520f93de693bdab0060746e38165,把这个值再拿到cmd5.com上去破解,过了很长时间,足有1分钟,提示“error!”,可以肯定没有破解成功!
哈哈!基本上就是这个思路了,因为第二次要破解的原文是一个32位的数字字母的结合,任它再牛B的硬盘也存不下这样的数据!
这里我写了一个递归函数来增加强度。
<?php
$testStr
='admin888';
$testC=10;
echo
Xmd5($testStr,$testC);
function
Xmd5($str,$c=0){
if(
$c>0){
$str=Xmd5(md5($str),--$c);
}
return
$str;
}
?>
10次MD5,这样加密出来的串应该够强大了,如果我们用这个方法来为会员密码提供加密,然后让管理员可以在后台设置XMD5的次数,那这样的密文强度将大大提高!
经常用GET方法传递参数的时候,这里将 $testC=mt_rand(100,999); 这样或许对安全性也有一定的帮助!~
还有一个问题是,多次的MD5会不会影响脚本性能,因为要进行相当复杂的计算~
我把'admin888'用md5加密了1000次,测试结果大概是这样:
79cbb81f5a6eb616b6897f61e7c76380
执行时间0.00805997848511 秒
测试结果显示,基本上属于正常范围,大可以放心使用。



cmd5网站已经是40T硬盘了!
没有一点意思,你这个是笨的不能再笨的做法,我想问一下,这样一来,你两次MD5跟1000次MD5出来的结果有什么区别吗?
别人如果要破解,只要按照32位的破解,其破解效率是一样,楼主真笨啊,估计是没有学过算法,我估计你的意思原来是想着一次MD5,出来的结果就增加32位吧,譬如说循环1000次,那么就是32000个字符MD5的结果吧,哈哈,
拜托,先去学习学习加密吧
是啊,这个方法很笨。第二次的密文是由32位十六进制字符组合,假如猜解的话就是得猜解一个32位的字符串,虽然第1000次也同样是猜解32位的字符串,但我写这个递归的作用是让这个MD5的次数也变的未知,这应该会大大增强密文的强度。
嗯,你的这个想法也很独特,但实事求是的说,尽管这篇文章写于07年,我确信我当时真的没有想过1000次以后是32000;非常感谢你的留言,我正学习算法的。
偶认为有那么一次md5(md5())就足够了哈哈。。。否则cmd5不是要弄个40T的硬盘了:)
好,长了见识