Sqlite3
開源版的Sqlite3是不支持加密功能的,對于一個保存在本地的數(shù)據(jù)庫來說沒有加密功能讓人難以接受。所幸Sqlite3的作者留下了加密接口,而互聯(lián)網(wǎng)上也有很多高人提供了他們的加密方案,其中有收費的,也有免費的。
這里選擇了一個免費的加密方案SQLCipher
,不過該方案沒有直接提供編譯好的庫,只是提供了源代碼,而且編譯略麻煩,如果你不想自己編譯,就只能花500美刀向作者購買編譯好的庫。吾輩屌絲只能望洋興嘆了,只能自己動手豐衣足食。
編譯SQLCipher
在本項目中沒有直接使用二進制庫(lib或者dll),而是直接將源代碼集成到項目中,畢竟sqlite3的源代碼就只有一個.c文件和一個頭文件。
SQLCipher提供了一個方法,用于將SQLCipher的加密代碼加到sqlite3的源碼上從而生成一個"聯(lián)合文件(amalgamation file)",最后將生成的文件加到項目里就好了。
./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC"
make sqlite3.c
執(zhí)行上述兩個命令就能生成以下幾個文件:
- sqlite3.h
- sqlite3.c
- sqlite3ext.h
- shell.c ——生成客戶端工具的代碼文件,我們用不到這個文件
以上命令都是在Ubuntu環(huán)境下執(zhí)行的,Windows環(huán)境也能編譯但需要額外安裝MSYS2之類的*unix模擬器。
注意:
SQLCipher庫的加密功能有openssl提供,所以首先編譯環(huán)境需要安裝openssl,Ubuntu已經(jīng)默認安裝了。
但編譯SQLCipher還需要用到libssl-dev庫,Ubuntu環(huán)境下可以用下面的命令安裝
sudo apt-get install libssl-dev
另外,在將代碼合入到工程中時,別忘了加上SQLITE_HAS_CODEC
和SQLITE_TEMP_STORE=2
這兩個宏
遇到的錯誤
Q: 預編譯頭文件來自編譯器的早期版本,或者預編譯頭為 C++ 而在 C 中使用它(或相反)
A: 工程中包含的sqlite3.c文件不需要stdafx.h預編譯頭,單獨將sqlite3.c的預編譯屬性設置為“不使用預編譯頭”
參考: http://blog.csdn.net/chenlycly/article/details/18423359