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(no>0)
{
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为字符组合
(全文完)

(0)

相关推荐

  • 如何使用对R语言中的car包进行安装并调用其方法

    car在英文中是汽车的意思,但是在R语言中,它还是一个编辑包.这个包中包含了一些分析的方法函数,安装这个包可以直接使用它里面的方法.下面利用一个实例说明car包安装过程和调用方法的过程,操作如下: 操 ...

  • Windows XP系统自动安装的方法

    目前采用常规的方法安装XP,通常需要 1 个小时以上。好在微软从 Windows 2000 开始就设计了全自动安装功能,大大节省了我们的时间。 在安装xp 时,对全自动安装功能的制作方法作了一些改进, ...

  • 为什么软件直接安装在C盘(为什么软件默认安装在c盘)

    电脑普及了那么多年了,使用Windows操作系统的小伙伴们有没有发现一个问题,每当我们安装软件时,默认的安装路径几乎都在C盘.众所周知,C盘作为Windows电脑的主分区,一般用来存储安装操作系统,并 ...

  • FbinstTool详细教程 万能启动超级简单实现图文详解

    关于FbinstTool万能启动的教程在无优论坛上已经有较为详细的帖子,但仍然有许多的朋友看完后一直是一头雾水.在此本人就针对大部分的初学者的理解能力做了以下相对简单明了的教程,希望能帮助更多的电脑爱 ...

  • 学习Access不得不知的陷阱和秘密技巧

    操作方法 01 导读:当对表格和报表进行操作时,MicrosoftAccess有一个无正式文本的特性.这个特性允许你从设计视窗性质sheetwindow中进行过程调用,调用的方法是同时按下shift和 ...

  • 如何打开DLL文件

    动态链接库又称DLL文件,是传统Windows编程的主要支柱.程序利用这些文件来获得额外的功能和库,而不需要将它们嵌入到程序中.通常DLL文件被很多不同的程序共享.对于大多数使用者来说,DLL文件是在 ...

  • 如何才能让IE浏览器安装调用未签名的ActiveX控件

    ActiveX控件做为IE浏览器专门一种插件程序,在我们使用IE过程中是会经常遇到的。比如当我们使用网银或支付宝等安全要求比较高的网站,都会提示我们需要安装ActiveX控件。 只有安装ActiveX ...

  • win8.1安装程序提示DllRegisterServer的调用失败错误代码为0×80070005的解决方法

    有些用户遇到在win8.1系统安装软件失败提示模块"Wintrust.dll"已加载,但对DllRegisterServer的调用失败,错误代码为0×80070005,具体问题现象 ...

  • 安装歌词转换器遇到DllRegisterServer的调用失败怎么办?

    今天安装歌词转换器的时候需要安装COMDLG32.OCX,在注册ActiveX控件时出错了, 错误提示是COMDLG32.OCX.ocx已加载,但是DllRegisterServer调用失败.其实在日 ...