让Cocos2d-x支持加密的sqlite

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

感谢楼主的分享,干货!

同时也期待楼主后续的分享。

编辑器已经在改革中了,很抱歉对您造成了不便。

很高兴论坛中乐于分享的人越来越多了。:801::801::801:

:2: :2: :2: :2:

:3:才发现 好东西,

加密加密,还是看到了密码,有意思。