Back to Forum Re New

数据库的新作用 利用数据库来破解md5

http://www.hackhome.com/InfoView/Article_98664_2.html

数据库的新作用 利用数据库来破解md5
日期:2007年6月7日 作者: 查看:[大字体 中字体 小字体]



  为什么密码位数短的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 &#39;<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>&#39;;
  
  // 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.&#39; &#39;.$md.&#39;<br>&#39;;
  
  $md = md5( $name );
  
  mysql_query(\"INSERT INTO `md` (`pass`, `passmd`) VALUES (&#39;$name&#39;, &#39;$md&#39;);\",$link);
  
  
  }
  
  }
  
  }
  
  }
  
  $time_end = getmicrotime();
  
  $time = $time_end - $time_start;
  
  
  echo &#39;<center>Runtime: &#39;.$time.&#39; seconds</center></font>&#39;;
  
  echo &#39;</body></html>&#39;;
  
  
  ?>
  
  通过运行这个程序构建数据用掉了我大概五分钟的时间。
  
  然后,一个很简单的脚本就可以实现密码的破解查询了。
  
  <?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 &#39;<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>&#39;;
  
  $time_start = getmicrotime();
  
  set_time_limit ( 0 );
  
  
  if ( 2 == $step )
  
  {
  
  $result = mysql_query( \"SELECT * FROM `md` WHERE `passmd`=&#39;$inpass&#39; LIMIT 0, 30 \" , $link );
  
  while ($row = mysql_fetch_array($result))
  
  {
  
  echo &#39;<p>The password is <b>&#39;.$row[0].&#39;</b><p>&#39;;
  
  echo &#39;<a href=\"index.php?\">click here to goback</a>&#39;;
  
  }
  
  }else
  
  {
  
  echo
  
  &#39;
  <form method=\"post\" >
  
  <input name=\"inpass\"><INPUT TYPE=\"hidden\" name=\"step\" value=\"2\">
  
  <INPUT TYPE=\"submit\">
  
  </form>
  
  &#39;;
  
  }
  
  $time_end = getmicrotime();
  
  $time = $time_end - $time_start;
  
  
  echo &#39;<center>Runtime: &#39;.$time.&#39; seconds</center></font>&#39;;
  
  echo &#39;</body></html>&#39;;
  
  ?>
  
  这样,很容易的就实现了密码破解。
  
  下边是演示:
  
  查询页面
  
  查询结果
  
  如果数据库足够大的话,破解MD5应该就不是什么困难的事情了,而且真正使用的密码并不是像理论上那么多,人们总是很习惯的使用简单好记的密码。在时间上,采用分布式计算是个好的选择。一旦这样的一个公用数据库建立起来,MD5将不再安全。一个好的办法是加长你的密码,长于13位的密码是比较有保障的。
EQ中文世纪地图集地址:
www.ceqmap.com
MD5在线查询破解

http://www.cmd5.com/
EQ中文世纪地图集地址:
www.ceqmap.com
Back to Forum