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

2024-09-06 14:48

本文主要是介绍Tokyo Cabinet和Tokyo Tyrant安装和调用手记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在编译 tokyocabinet 时会报 configure: error: bzlib.h is required 的错误。

解决方法是:   yum install bzip2-devel


configure: error: zlib.h is required
原来没有zlib包 
rpm -ql zlib命令查询后发现存在 
[root@cenosvmbase tokyocabinet-1.4.41]# rpm -ql zlib
/usr/lib64/libz.so.1
/usr/lib64/libz.so.1.2.3
/usr/share/doc/zlib-1.2.3
用./configure --help知道可以手工指定则用命令
如果没有安装源码包会找不到文件
装源码包的命令是 sudo yum install zlib-devel


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


http://www.sectop.com/post/69.html

2011-02-09 07:24:50|  分类: linux技术|字号 订阅

在对网站进行安全检测的过程中,总是会遇到密码破解的问题,破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 <stdbool.
#include <stdlib.h
>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);
or: %s\n", tchdberrmsg(ecode)); }
fprintf(stderr, "open er
r

 

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

 

/* retrieve records */
value = tchdbget2(hdb, "foo");
if(value){
ntf("%s\n", value);fr
pr
iee(value);
} else {
ecode(hdb);fprintf(stde
        ecode = tchd brr, "get error: %s\n", tchdberrmsg(ecode));
}

 

/* traverse records */
tchdbiterinit(hdb);
ernext2(hdb)) != NULL){value = tch
while((key = tchdbi
tdbget2(hdb, key);
        if(value){
value);free(value);}
                printf("%s:%s\n", key ,  free(key);
}

 

/* close the database */
if(!tchdbclose(hdb)){
code(hdb);fprintf(stder
ecode = tchdb
er, "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为字符组合

(全文完)

注:http://www.00aq.com/md5.php 提供免费MD5查询,以后还会陆续推出mysql等密码免费查询平台,敬请期待

文章来源:DoDo's Blog

原文地址:http://www.sectop.com/post/69.html

这篇关于Tokyo Cabinet和Tokyo Tyrant安装和调用手记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1142313

相关文章

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

python如何调用java的jar包

《python如何调用java的jar包》这篇文章主要为大家详细介绍了python如何调用java的jar包,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录一、安装包二、使用步骤三、代码演示四、自己写一个jar包五、打包步骤六、方法补充一、安装包pip3 install

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

MySQL MCP 服务器安装配置最佳实践

《MySQLMCP服务器安装配置最佳实践》本文介绍MySQLMCP服务器的安装配置方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录mysql MCP 服务器安装配置指南简介功能特点安装方法数据库配置使用MCP Inspector进行调试开发指

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Java SWT库详解与安装指南(最新推荐)

《JavaSWT库详解与安装指南(最新推荐)》:本文主要介绍JavaSWT库详解与安装指南,在本章中,我们介绍了如何下载、安装SWTJAR包,并详述了在Eclipse以及命令行环境中配置Java... 目录1. Java SWT类库概述2. SWT与AWT和Swing的区别2.1 历史背景与设计理念2.1.