让Cocos2d-x支持加密的sqlite

 - by Hector

前话

sqlite本身提供了加密的接口,但是免费版本中没有提供相应的实现,目前网上有一些相应的实现,但是大部分集成成本太高,
其他的比如利用ssl实现加密,需要集成ssl到项目中去;尝试自己实现,发现成本也很高,相关文档很少,而且大部分
是基于低版本的。直到发现wxsqlite3,一个近乎完美的sqlite加密方案。

wxsqlite3

wxSqlite3作为wxWidgets的扩展组件用C++语法对Sqlite3的API进行了封装,为Sqlite3的使用提供了方便,并顺带实现了加密。
wxWidgets是一个著名的C++跨平台UI框架。支持两种加密算法,128位的rijndael算法(默认)和256位的AES算法。
下载:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/

Makefile版编译

其实wxsqlite3中已经说明了编译方法。我们只需要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 <stdio.h>
#include "sqlite3.h"
#include "string.h"

#define dbPassWord "I am is a Password"
#define dbFile "test.sqlite"

int main()
{
    sqlite3 *db;
    char pwd[100] = 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的所有文件都删除引用。

Leave a comment