网普技术论坛 网普科技  
» 游客:   网普主页 | 注册 | 登录 | 帮助
 

作者:
标题: 利用数据库来破解md5[转] 上一主题 | 下一主题
??????
网普成员





积分 100
发贴 99
注册 2004-10-10
状态 离线
#1  利用数据库来破解md5[转]

破解MD5 KBUG(原作)
为什么密码位数短的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字符。

表的结构如下:


然后通过程序来向里边添加数据:


  Code: [Copy to clipboard]   
<?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>';



?>



通过运行这个程序构建数据用掉了我大概五分钟的时间。

然后,一个很简单的脚本就可以实现密码的破解查询了。


  Code: [Copy to clipboard]   
<?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位的密码是比较有保障的。



PS:看不清楚的人可以到:
http://www.csdn.net/develop/Read_Article.asp?Id=19029
去观看!

2004-10-12 12:08 PM
查看资料  发送邮件  发短消息   编辑帖子  引用回复 顶部
茱莉娅
THE BODY SHOP美容顾问

茱莉娅美体小铺


积分 100
发贴 99
注册 2009-5-21
来自 茱莉娅美体小铺
状态 离线
#1  赞助商信息The body shop

茱莉娅美体小铺
茱莉娅美体小铺淘宝店
茱莉娅美体小铺
2004-10-12 12:08 PM
查看资料  发送邮件  发短消息   编辑帖子  引用回复 顶部


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转:  




Powered by Discuz! 2.5 © 2001-2005 Comsenz Technology Ltd.
Processed in 0.005676 second(s), 7 queries, Gzip enabled
------------------------------------------------------------------------------
本论坛属网普科技交流与技术支持论坛!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!
美国主机, 美国虚拟主机, cPanel+PHP+Mysql+Ftp+Email+Zend+GD2+国际域名支持
技术支持 QQ: 126818 EMail & MSN: support[AT]netpu.net
[ 联系我们 ] - [ 网普科技 ]