近期打算把之前做项目中积累的一些经验在我博客中分享出来,如果大家看着还行,在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的所有文件都删除引用。
才发现 好东西,