破解MD5
来源:互联网 发布:linux端口通信 编辑:程序博客网 时间:2024/03/29 19:48
为什么密码位数短的MD5不安全?
一个长度为4的纯小写字母生成的密码在数据库的帮助下可以在0.005s内被破解。这个时间还包括了连接数据库的时间,运行的环境是在我900MHZ的个人PC上。
注意,我们要讨论的是一种破解密码的思维,而不提供一种具体的方法。如果你的希望和我们不一致,那么后边将不是你所需要的内容了。
前几天看MD5的资料时,我突然冒出个想法:
如果借助数据库的海量存储和检索优势,破解较短长度的单向MD5应该不是很大的问题。
首先,我们假设密码长度为6的话(这是很多论坛采用的长度),如果密码都由小写字母构成的话,这个数据库要存储266条数据,每条数据的长度为6+40=46字节,那么这个数据库的大小是14210125696byte,大约为14G。对于一个大型数据库来说这样的数据量并不大。
为了使我的计算机可以比较快的实现我的想法,我假设密码长度为四位小写字母了。下边就让我们来看看过程。
我运行的环境: Windows XP Pro,Apache1.3,MySql 3.23.49,PHP 4.0.6。 主频900MHZ,内存256M。 |
首先我在Mysql里建立了一个md库和一个md表用于存放密码和加密后的MD5字符。
表的结构如下:
然后通过程序来向里边添加数据:
<?php // Connecting, selecting database $link = mysql_connect("localhost", "root", "") or die("Could not connect"); print "Connected successfully<br>"; mysql_select_db("md") or die("Could not select database"); function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } $time_start = getmicrotime(); set_time_limit ( 0 ); echo '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>md5</title> <style> <!-- html { font-family: Verdana; font-size: 9pt } --> </style> </head> <body>'; // create the password for ($i = 97 ; $i < 123 ; $i++ ) { for( $j = 97 ; $j < 123 ; $j++ ) { for ( $k = 97 ; $k < 123 ; $k++ ) { for( $l = 97 ; $l < 123 ; $l++ ) { $name = chr($i).chr($j).chr($k).chr($l); echo $name.' '.$md.'<br>'; $md = md5( $name ); mysql_query("INSERT INTO `md` (`pass`, `passmd`) VALUES ('$name', '$md');",$link); } } } } $time_end = getmicrotime(); $time = $time_end - $time_start; echo '<center>Runtime: '.$time.' seconds</center></font>'; echo '</body></html>'; ?> |
通过运行这个程序构建数据用掉了我大概五分钟的时间。
然后,一个很简单的脚本就可以实现密码的破解查询了。
<?php $link = mysql_connect("localhost", "root", "") or die("Could not connect"); print "Connected successfully<br>"; mysql_select_db("md") or die("Could not select database"); function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } echo '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>md5</title> <style> <!-- html { font-family: Verdana; font-size: 9pt } INPUT { BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid; FONT-FAMILY: Verdana } --> </style> </head> <body>'; $time_start = getmicrotime(); set_time_limit ( 0 ); if ( 2 == $step ) { $result = mysql_query( "SELECT * FROM `md` WHERE `passmd`='$inpass' LIMIT 0, 30 " , $link ); while ($row = mysql_fetch_array($result)) { echo '<p>The password is <b>'.$row[0].'</b><p>'; echo '<a href="index.php?">click here to goback</a>'; } }else { echo ' <form method="post" > <input name="inpass"><INPUT TYPE="hidden" name="step" value="2"> <INPUT TYPE="submit"> </form> '; } $time_end = getmicrotime(); $time = $time_end - $time_start; echo '<center>Runtime: '.$time.' seconds</center></font>'; echo '</body></html>'; ?> |
这样,很容易的就实现了密码破解。
下边是演示:
查询页面
查询结果
如果数据库足够大的话,破解MD5应该就不是什么困难的事情了,而且真正使用的密码并不是像理论上那么多,人们总是很习惯的使用简单好记的密码。在时间上,采用分布式计算是个好的选择。一旦这样的一个公用数据库建立起来,MD5将不再安全。一个好的办法是加长你的密码,长于13位的密码是比较有保障的。
- 破解MD5
- MD5破解
- MD5破解网站
- Md5密码在线破解
- MD5密码破解数据库!!
- 关于MD5破解这件事
- MD5解密破解网站
- MD5在线破解地址
- MD5 在线查询破解
- 谈谈MD5的破解
- MD5的破解
- MD5破解之法
- MD5测试破解
- MD5免费在线破解
- 常用MD5破解网站
- python -- md5 破解
- Md5密码破解
- 关于王小云破解MD5
- 深入分析基于VCL派生的ActiveX控件的实现原理及应用
- PHP演绎(数组)
- MM,Computer&Me [ 2004整理版 ]
- php演绎(2)——数组的排序
- PHP是一种没有前途的嵌入式脚本语言?
- 破解MD5
- Echo指南(一)
- 进程和线程
- Arrays 101
- 高亮你的PHP代码
- 最简单的留言板
- Echo指南(二)
- Memory随想
- 白刃之战:PHP vs. ASP.NET(节选)-架构比较