Tokyo Cabinet和Tokyo Tyrant安装和调用手记

如题所述

在对网站进行安全检测的过程中,总是会遇到密码破解的问题,破md5总是去www.cmd5.com,但是很多密码都是收费的,无奈囊中羞涩。如果遇到mysql用password加密的密码,更是无从破解,有人会说用爆破工具,那稍微复杂一点密码,就要破死人。于是想自己搞一个密码破解的网站起来,md5,mysql等密码的破解都加进去。

首先选择数据库和web语言,cmd5用的是.net,数据库不得而知(猜测可能是sql server吧),因为不会.net,而我对开源的平台熟一些,所以web语言选用了php。数据库这块,因为想想这样的密码存储数据库是相当大的,而传统的mysql,pgsql或者oracle,虽然功能强大,但是我感觉都不适合,因为我只需要密码和散列一一对应的功能,即key-value的功能。在网上搜寻类似的数据库,结果发现了这个Tokyo Cabinet。它是日本人平林?中?只谈技术,不涉及历史问题)开发的一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍。利用Tokyo Tyrant作为Tokyo Cabinet数据库的网络接口,兼容memcached接口,也支持http协议的数据交换。

一、安装

1、首先编译安装tokyocabinet数据库

编译的时候会提示找不到zlib.h和bzlib.h,那么先安装zlib-devel和bzip2-devel这两个包分别有这两个头文件

复制代码

  

代码如下:

rpm -ivh zlib-devel-1.2.3-3.i386.rpm

  rpm -ivh bzip2-devel-1.0.3-4.el5_2.i386.rpm

  wget http://1978th.net/tokyocabinet/tokyocabinet-1.4.41.tar.gz

  tar zxvf tokyocabinet-1.4.41.tar.gz

  cd tokyocabinet-1.4.41/

  ./configure –enable-off64 #启动64位偏移,因为我机器是32位,如果数据库文件超过2G,不加此参数ttserver会崩溃

  make

  make install

  cd ../

2、然后编译安装tokyotyrant

复制代码

  

代码如下:

wget http://1978th.net/tokyotyrant/tokyotyrant-1.1.39.tar.gz

  tar zxvf tokyotyrant-1.1.39.tar.gz

  cd tokyotyrant-1.1.39/

  ./configure

  make

  make install

  cd ../

二、配置

1、创建Tokyo Tyrant数据文件存放目录

mkdir -p /ttserver/

2、启动Tokyo Tyrant主进程

运行之前要设置lib搜索路径,否则会提示找不到库文件

echo '/usr/local/lib' /etc/ld.so.conf

ldconfig -v

1)单机模式

复制代码

  

代码如下:

ulimit -SHn 51200

  ttserver -host 127.0.0.1 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 1 -rts /ttserver/ttserver.rts /ttserver/database.tch

2)互为主辅

注:数据库类型由后缀决定,因为我只需要key-value的功能,所以采用功能简单,速度快的hash database

Hash Database :.tch

B+ tree database :.tcb

fixed-length database :.tcf

table database :.tct

内存Hash Database :*

内存B+ tree database :+

服务器 192.168.1.110

ulimit -SHn 51200

ttserver -host 192.168.1.110 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 110 -mhost 192.168.1.92 -mport 11111 -rts /ttserver/ttserver.rts /ttserver/database.tch

服务器 192.168.99.111

ulimit -SHn 51200

ttserver -host 192.168.1.111 -port 11111 -thnum 8 -dmn -pid /ttserver/ttserver.pid -log /ttserver/ttserver.log -le -ulog /ttserver/ -ulim 128m -sid 111 -mhost 192.168.1.91 -mport 11111 -rts /ttserver/ttserver.rts /ttserver/database.tch

3)参数说明

ttserver [-host name] [-port num] [-thnum num] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sid num] [-mhost name] [-mport num] [-rts path] [dbname]

-host name : 指定需要绑定的服务器域名或IP地址。默认绑定这台服务器上的所有IP地址。

-port num : 指定需要绑定的端口号。默认端口号为1978

-thnum num : 指定线程数。默认为8个线程。

-tout num : 指定每个会话的超时时间(单位为秒)。默认永不超时。

-dmn : 以守护进程方式运行。

-pid path : 输出进程ID到指定文件(这里指定文件名)。

-log path : 输出日志信息到指定文件(这里指定文件名)。

-ld : 在日志文件中还记录DEBUG调试信息。

-le : 在日志文件中仅记录错误信息。

-ulog path : 指定同步日志文件存放路径(这里指定目录名)。

-ulim num : 指定每个同步日志文件的大小(例如128m)。

-uas : 使用异步IO记录更新日志(使用此项会减少磁盘IO消耗,但是数据会先放在内存中,不会立即写入磁盘,如果重启服务器或ttserver进程被kill掉,将导致部分数据丢失。一般情况下不建议使用)。

-sid num : 指定服务器ID号(当使用主辅模式时,每台ttserver需要不同的ID号)

-mhost name : 指定主辅同步模式下,主服务器的域名或IP地址。

-mport num : 指定主辅同步模式下,主服务器的端口号。

-rts path : 指定用来存放同步时间戳的文件名。

3、停止ttserver进程

ps aux | grep ttserver | grep -v 'grep' | awk -F ' ' '{print $2}' | xargs kill -TERM

三、调用

1、使用memcached兼容协议

2、http调用

写 curl -X PUT http://127.0.0.1:11111/key -d "value"

读 curl http://127.0.0.1:11111/key

删 curl -X DELETE http://127.0.0.1:11111/key

3、使用C调用

1)直接写文件

例:

我使用的是hash database 所有函数带tch前缀,如果是其他数据库请参考tokyocabinet-1.4.31/doc下spex-en.html的函数接口说明

复制代码

  

代码如下:

#include tcutil.h#include tchdb.h#include stdlib.h#include stdbool.h#include stdint.h

  int main(int argc, char **argv){TCHDB *hdb;int ecode;char *key, *value;

  /* create the object */hdb = tchdbnew();

  /* open the database */if(!tchdbopen(hdb, "casket.tch", HDBOWRITER | HDBOCREAT)){

  ecode = tchdbecode(hdb);

  fprintf(stderr, "open error: %s/n", tchdberrmsg(ecode));}

  /* store records */if(!tchdbput2(hdb, "foo", "hop") ||!tchdbput2(hdb, "bar", "step") ||!tchdbput2(hdb, "baz", "jump")){ ecode = tchdbecode(hdb); fprintf(stderr, "put error: %s/n", tchdberrmsg(ecode));}

  /* retrieve records */value = tchdbget2(hdb, "foo");if(value){ printf("%s/n", value); free(value);} else { ecode = tch

  dbecode(hdb);

  fprintf(stderr, "get error: %s/n", tchdberrmsg(ecode));}

  /* traverse records */tchdbiterinit(hdb);while((key = tchdbiternext2(hdb)) != NULL){ value = tchdbget2(hdb, key); if(value){ printf("%s:%s/n", key, value); free(value);

  }

  free(key);}

  /* close the database */if(!tchdbclose(hdb)){ ecode = tchdbecode(hdb); fprintf(stderr, "close error: %s/n", tchdberrmsg(ecode));}

  /* delete the object */tchdbdel(hdb);

  return 0;}

2)使用网络读写

例:

请参考tokyotyrant-1.1.33/doc下index.html的函数接口说明

复制代码

  

代码如下:

#include tcrdb.h

  #include stdlib.h

  #include stdbool.h

  #include stdint.h

  int main(int argc, char **argv){

  TCRDB *rdb;

  int ecode;

  char *value;

  /* create the object */

  rdb = tcrdbnew();

  /* connect to the server */

  if(!tcrdbopen(rdb, "localhost", 1978)){

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "open error: %s/n", tcrdberrmsg(ecode));

  }

  /* store records */

  if(!tcrdbput2(rdb, "foo", "hop") ||

  !tcrdbput2(rdb, "bar", "step") ||

  !tcrdbput2(rdb, "baz", "jump")){

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "put error: %s/n", tcrdberrmsg(ecode));

  }

  /* retrieve records */

  value = tcrdbget2(rdb, "foo");

  if(value){

  printf("%s/n", value);

  free(value);

  } else {

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "get error: %s/n", tcrdberrmsg(ecode));

  }

  /* close the connection */

  if(!tcrdbclose(rdb)){

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "close error: %s/n", tcrdberrmsg(ecode));

  }

  /* delete the object */

  tcrdbdel(rdb);

  return 0;

  }

四、构建密码破解web平台,自动生成数据

1、构建web平台

web界面上我就采用了cmd5的风格,改了下颜色。。不太熟悉美工方面,只能改成这样。。。http://www.00aq.com/md5.php

关键代码:

复制代码

  

代码如下:

//md5.php(使用memcached-client.php里面有操作memcached的类,包含之后直接调用,网上都可以下载到)

  ?php

  require_once('memcached-client.php');

  include('config.php');

  $key = $_POST['key'];

  if(isset($key))

  {

  if(strlen($key) == 32)

  {

  $key = substr($key, 8, 16);

  }

  $key = strtolower($key);

  $mc = new memcached($links);

  $value = $mc-get($key);

  if(!isset($value))

  {

  $value = '未查到';

  }

  }

  ?

  //config.php

  ?php

  $links = array(

  'servers' = array('192.168.99.111:11111′),

  'debug' = false,

  'compress_threshold' = 10240,

  'persistant' = false

  );

  ?

2、自动插入密码数据

复制代码

  

代码如下:

//autoaddnet.c

  #include tcrdb.h

  #include stdlib.h

  #include stdbool.h

  #include stdint.h

  #include md5lib.h

  int main(int argc, char **argv)

  {

  TCRDB *rdb;

  int ecode;

  char *source, *value;

  int length = *argv[1] – '0′; //字符长度

  int mode = *argv[2] – '0′; //字符组合类型

  int len = 0, count = 1, i = 0, tonext_value = 0, no = 0;

  int series[62] = {0};

  rdb = tcrdbnew();

  if(!tcrdbopen(rdb, "192.168.99.111", 11111)) //打开数据库连接

  {

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "open error: %s/n", tcrdberrmsg(ecode));

  }

  switch(mode) //选择字符的组合

  {

  case 1:

  source = "1234567890";

  break;

  case 2:

  source = "abcdefghijklmnopqrstuvwxyz";

  break;

  case 3:

  source = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

  break;

  case 4:

  source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

  break;

  case 5:

  source = "abcdefghijklmnopqrstuvwxyz1234567890";

  break;

  case 6:

  source = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";

  break;

  default: / source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";

  break;

  }

  len = strlen(source); //计算字符长度

  for(i = 0; i length; i++)

  {

  count *= len; //计算所有组合的总数

  }

  for(i = 0; i count; i++)

  {

  char word[20] = {0}; //word为组合出的字符串

  tonext_value = 1;

  word[length] = '/0′;

  for(no = length-1; no = 0; no–)

  {

  word[no] = source[series[no]]; //循环填充word字符数组中的每个字符

  series[no] += tonext_value;

  if(no0)

  {

  if(series[no] == len) //如果已经到达source末尾则从新开始

  {

  series[no]=0;

  tonext_value=1;

  }

  else

  {

  tonext_value=0;

  }

  }

  }

  char *md5 = MDString(word); //word原始字符转换成md5

  value = tcrdbget2(rdb, md5); //得到此MD5在db中的value

  *(md5+24) = '/0′; //截取32位md5的8-24位

  if(!value) //如果db中没有此value,进行插入

  {

  if(!tcrdbput2(rdb, md5+8, word))

  {

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "put error: %s/n", tcrdberrmsg(ecode));

  }

  printf("%s/n", word);

  }

  else

  {

  printf("%s-16 exist/n", word);

  free(value);

  }

  }

  if(!tcrdbclose(rdb)) //关闭数据库连接

  {

  ecode = tcrdbecode(rdb);

  fprintf(stderr, "close error: %s/n", tcrdberrmsg(ecode));

  }

  tcrdbdel(rdb); //删除数据库对象

  return 0;

  }

编译方法:

gcc -I. -I/usr/local/include autoaddnet.c -o autoaddnet -L/usr/local/lib -ltokyotyrant -lz -lbz2 -lrt -lpthread -lm -lc

用法:

./autoaddnet length mode

length为字符长度,mode为字符组合

(全文完)

温馨提示:答案为网友推荐,仅供参考
相似回答