首页 电脑 电脑学堂 查看内容

利用数据库来破解md5

2004-9-29 20:05 691 0

摘要: 为什么密码位数短的MD5不安全? 一个长度为4的纯小写字母生成的密码在数据库的帮助下可以在0.005s内被破解。这个时间还包括了连接数据库的时间,运行的环境是在我900MHZ的个人PC上。 &nb...
关键词: nbsp 密码 time 数据库 getmicrotime MySql 长度 echo 一个 小写

为什么密码位数短的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字符。 表的结构如下:       然后通过程序来向里边添加数据: // Connecting, selecting database $link = mysql_connect("localhost", "root", "") or die("Could not connect"); print "Connected successfully"; 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 { font-family: Verdana; font-size: 9pt }-->   ";   // create the password   for ($i = 97 ; $i {        for( $j = 97 ; $j   )        {               for ( $k = 97 ; $k               {                                           for( $l = 97 ; $l                      {                                                  $name = chr($i).chr($j).chr($k).chr($l);                                           echo $name."  ".$md."";                                           $md = md5( $name );                                           mysql_query("INSERT INTO `md` (`pass`, `passmd`) VALUES ("$name", "$md");",$link);                                           }               }        } }   $time_end = getmicrotime(); $time = $time_end - $time_start;   echo " Runtime: ".$time." seconds"; echo "";   ?>   通过运行这个程序构建数据用掉了我大概五分钟的时间。 然后,一个很简单的脚本就可以实现密码的破解查询了。     $link = mysql_connect("localhost", "root", "") or die("Could not connect"); print "Connected successfully"; mysql_select_db("md") or die("Could not select database");   function getmicrotime() {     list($usec, $sec) = explode(" ",microtime());     return ((float)$usec + (float)$sec); }   echo " 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}-->   ";   $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 " The password is ".$row[0]." ";               echo "click here to goback";        } }else {        echo "                             "; }   $time_end = getmicrotime(); $time = $time_end - $time_start;   echo " Runtime: ".$time." seconds"; echo ""; ?>   这样,很容易的就实现了密码破解。 下边是演示:   查询页面   查询结果   如果数据库足够大的话,破解MD5应该就不是什么困难的事情了,而且真正使用的密码并不是像理论上那么多,人们总是很习惯的使用简单好记的密码。在时间上,采用分布式计算是个好的选择。一旦这样的一个公用数据库建立起来,MD5将不再安全。一个好的办法是加长你的密码,长于13位的密码是比较有保障的。
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部