前几天突然想把md5加密的字符串一一利用穷举逐一翻译,昨晚我为这个测试到1点多钟。当然我不知道有多少网站或系统的密码是用md5加密的,如果是纯数字的话,我得到密文后,可以利用穷举的方式进行翻译得到密码原文。虽然md5算法是不可逆的,但由于是一一对应,所以我用了一笨方法,就是利用1-99999999逐一用md5加密,写入数据库。我为什么这样做? 当然是为了查询,8位的数字密码可以瞬间破解,呵呵。另外我是为了测试mysql的表性能,听说单一表超过10万条记录,性能就会大幅下降。

      其实是很简单的,建一个表,写入两个字段,一个是原密码num,一个是md5加密后的密文:
set_time_limit(0);
$link=@mysql_connect("机器名","用户名","密码") or die("不能连接数据库!");
  @mysql_select_db("md5db") or die("不能选择数据库");
//$q1="insert into digital (num,md5string) values";
$min=1;
$max=200000; //这个数不能设置太大,一次插入太多就会出现mysql gone away的出错信息,想改大一些就看下面的修改my.cnf。
$starttime=mktime();
for ($i=$min; $i<$max; $i++)
{
  $str.=" ($i,md5($i)),";
}
  $qmax=" ($max,md5($max))";
  $str.=$qmax;
  $query="insert into digital (num,md5string) values";
  $query.= $str;
  $Result = mysql_query($query) or die(mysql_error());
$endtime=mktime();
echo $endtime-$starttime;
?>

      运行之前还要优化一下mysql,默认的my.cnf(windows版本的好像叫my.ini)是针对一些小网站的,它也提供了几个不同环境的配置文件供你选择。
[mysqld]
max_allowed_packet=32M
read_buffer_size=2M
read_rnd_buffer_size=4M

      运行上面的php,就会根据你的设定一次性插入记录,当然你可以分批插入,运行完接着修改min和max就可以了,免得搞得mysql承受不了。
      实践证明,循环用insert into table (num,md5string) values (x,md5(x)),(x+1,md5(x+1))...比
insert into table (num,md5string) values (x,md5(x))  
insert into table (num,md5string) values (x+1,md5(x+1))  
快很多很多,即用一条命令插入全部数值,比分开每条插入快很多,所以上面代码也是用这种形式。

      mysql的性能相当不错,很快就可以插入几十万条记录,由于我没有做索引,所以查询起来有点慢,300万条记录,大概用8秒才能查询到,后来我给md5string这个字段做了索引,搜索只用了零点几秒时间,快得惊人,但付出的代价是,插入记录的时候,慢了很多很多,因为要额外写索引信息。所以,最好还是先插入好数据,到最后才做索引。
      还有一些工作还没完成,就是测试mysql的单一表是否超过10万行性能就下降得很厉害,留给下次再做吧。怎么,你有兴趣用这个破解密文? 玩玩测试算了吧。呵呵。
Tags:
电脑 » UNIX | 评论(0) | 引用(0) | 阅读(158)