近期打算把之前做项目中积累的一些经验在我博客中分享出来,如果大家看着还行,在http://www.yiwuye.com/会看到后续更新。这里编辑教程格式太痛苦了
前话
http://www.yiwuye.com/tag/sqlite本身提供了加密的接口,但是免费版本中没有提供相应的实现,目前网上有一些相应的实现,但是大部分集成成本太高,
其他的比如利用ssl实现加密,需要集成ssl到项目中去;尝试自己实现,发现成本也很高,相关文档很少,而且大部分
是基于低版本的。直到发现http://www.yiwuye.com/tag/wxsqlite3,一个近乎完美的http://www.yiwuye.com/tag/sqlite加密方案。
http://www.yiwuye.com/tag/wxsqlite3
wxSqlite3作为wxWidgets的扩展组件用C++语法对Sqlite3的API进行了封装,为Sqlite3的使用提供了方便,并顺带实现了加密。
wxWidgets是一个著名的C++跨平台UI框架。支持两种加密算法,128位的rijndael算法(默认)和256位的AES算法。
下载:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/
Makefile版编译
其实wxhttp://www.yiwuye.com/tag/sqlite3中已经说明了编译方法。我们只需要sqlite3/secure/src文件夹的内容,并且只需编译sqlite3secure.c文件(其他文件,sqlite3secure已经包含进去了,如果自己加会通不过编译),
其编译方法在最外层的README.txt说明了,这里我们写一个测试程序验证我们的加密方法,稍加修改就可作为项目的加密解密数据库工具。
1.启用宏
需要在sqlite3secure.c最上面添加宏,启用加密
#define SQLITE_HAS_CODEC
//启用256位加密,如果不启用,可不加
#define CODEC_TYPE CODEC_TYPE_AES256
在sqlite3.h或者main.c最上面添加
#define SQLITE_HAS_CODEC
启用头文件支持
2.makefile 文件make
CC=gcc CFLAGS=-I. DEPS = sqlite3.h OBJ = main.o sqlite3secure.o %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) main: $(OBJ) $(CC) -o $@ $^ $(CFLAGS) clean: rm -f *.o ``` 3.测试文件main.c#include #include "sqlite3.h" #include "string.h" #define dbPassWord "I am is a Password" #define dbFile "test.sqlite" int main() { sqlite3 *db; char pwd = dbPassWord; if (sqlite3_open(dbFile , &db) == SQLITE_OK && (sqlite3_exec(db, "create table users(uid INTEGER,uname text)", NULL, NULL, NULL)==SQLITE_OK) ) { printf("1.打开未加密数据库成功,正在加密……\n"); sqlite3_rekey(db,pwd,strlen(pwd)); sqlite3_close(db); } else{ printf("打开未加密数据库失败\n"); return 0; } if (sqlite3_open(dbFile , &db) == SQLITE_OK) { if(sqlite3_key(db,pwd,strlen(pwd)) == SQLITE_OK && (sqlite3_exec(db, "drop table users;", NULL, NULL, NULL)==SQLITE_OK) ) { printf("2.验证加密,加密成功\n"); } else{ printf("加密失败\n"); } } if(sqlite3_rekey(db,NULL,0) == SQLITE_OK) { printf("3.解密数据库成功……\n"); sqlite3_close(db); } return 0; } ``` Android启用 1.写个Android.mk文件,和上面的所有文件放在external/wxsqlite3目录下LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := wxsqlite3_static LOCAL_MODULE_FILENAME := libwxsqlite3 #LOCAL_CFLAGS := \ #-DSQLITE_HAS_CODEC \ #-DCODEC_TYPE=CODEC_TYPE_AES128 LOCAL_SRC_FILES := \ sqlite3secure.c LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) LOCAL_C_INCLUDES := $(LOCAL_PATH) include $(BUILD_STATIC_LIBRARY) ``` 2.在项目的Android.mk文件中添加支持 LOCAL_WHOLE_STATIC_LIBRARIES += wxsqlite3_static $(call import-module,external/wxsqlite3) iOS支持 添加代码目录,找到我们刚才添加的那个文件夹,添加好后,将除sqlite3.h和sqlite3secure.c的所有文件都删除引用。