sqlcipher是一個對sqlite資料庫進行aes256加密的開源庫,其強大的跨平台性讓它被許多知名企業使用,例如三星、摩托羅拉、蘋果等等,從ios2-ios6蘋果一直采用sqlcipher,安卓平台可以支援os2.x-os4.4.
項目本身不提供加密算法,調用openssl的aes加密算法,其官方稱隻要能使用sqlite、有openssl庫的平台都可使用sqlcipher。
一、ubuntu下編譯
1.編譯依賴的openssl庫
到ftp://ftp.openssl.org/source下載下傳zip安裝包
解壓源碼到ubuntu下,進入openssl源碼根目錄
./config shared –prefix=/home/xxxxx
make && make install
在/home/xxxxx目錄即生成了openssl的相關動态、靜态庫,将庫拷貝到系統預設庫目錄
cp openssl/lib/* /usr/lib/
2.編譯sqlcipher
https://github.com/sqlcipher/sqlcipher下載下傳sqlcipher源碼包
解壓源碼到ubuntu下,進入sqlcipher源碼根目錄,
./configure –enable-tempstore=yes CFLAGS=”-DSQLITE_HAS_CODEC” LDFLAGS=”-lcrypto” –prefix=/xxxx
make && make install
基本ubuntu下編譯很簡單,沒啥意外。
二、arm-linux-gcc交叉編譯
1.編譯arm平台下的openssl庫
AR=”arm-linux-ar” RANLIB=arm-linux-ranlib CC=arm-linux-gcc /usr/bin/perl ./Configure linux-armv4 –prefix=”/home/software/arm_openssl/”
make && make install
2.交叉編譯sqlcipher
./configure –prefix=/xxxxx –enable-tempstore=yes CFLAGS=”-DSQLITE_HAS_CODEC” LDFLAGS=”-lcrypto” –host=”arm-none-linux-gnueabi”
make && make install
由于寫這份文檔的時間距離搞sqlcipher過去很久了,許多編譯出錯的點都忘了,大概能整理這麼多吧,其它一些編譯需要注意的點就忘了,有什麼問題可以留言。
三、測試sqlcipher的加密、解密、加密以有資料庫、解密加密過的資料庫
—–指令行
對指令行的這些api測試官方網站上的文檔其實寫清楚了,貼上部分
-
建立加密資料庫
$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA key = ‘thisiskey’;
sqlite> create table encrypted (id integer, name text);
sqlite> .schema
CREATE TABLE encrypted (id integer, name text);
sqlite> .q
-
打開加密資料庫
$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA key = ‘thisiskey’;
sqlite> .schema
CREATE TABLE encrypted (id integer, name text);
-
修改資料庫密碼
sqlite> PRAGMA rekey = ‘newkey’;
-
加密已有的資料庫
$ sqlcipher banklist.sqlite3
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> ATTACH DATABASE ‘encrypted.db’ AS encrypted KEY ‘thisiskey’;
sqlite> SELECT sqlcipher_export(‘encrypted’);
sqlite> DETACH DATABASE encrypted;
-
解密資料庫
$ sqlcipher encrypted.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA key = ‘thisiskey’;
sqlite> ATTACH DATABASE ‘plaintext.db’ AS plaintext KEY ”;
sqlite> SELECT sqlcipher_export(‘plaintext’);
sqlite> DETACH DATABASE plaintext;
—–cpp代碼
與sqlite代碼一樣,不一樣的地方是每次進行資料庫open之後要緊跟密碼認證:
sqlite3_exec(db, “PRAGMA key = ‘password’”, NULL, NULL, NULL);
從這條指令也可以看出sqlcipher的代碼執行的sql語句可以是sqlcipher自定義的指令行語句,例如”PRAGMA”等等。
(文檔寫得很爛,也沒查錯,太困了 。。。下次有時間優化一下文檔吧)
.
.
.
.
.
.
.
(20160622,補一個)
記起來當時要實作在arm9裡對sqlite資料庫進行加密,編譯了sqlcipher後,在arm9環境跑,每次操作資料庫進行第一次認證需要20+s時間,這肯定不能忍,期間檢視了編譯選項,嘗試編譯不同的庫,都不能解決問題;又在百度搜尋,可是相關資料實在太少。
無奈耗費時間做了工作想想要放棄這個方案,我不甘心,給sqlcipher開源庫作者發郵件,哈哈,我那蹩腳的英文,洋洋灑灑寫得我都臉紅感覺把問題闡述清楚了,也沒期望作者能回,沒想到真的後來回了,不過也沒什麼實質性的建議。
我還是不甘心,于是在官網看官方文檔,看api,最終看到sqlcipher有一個修改加鹽hash次數的接口,提到其預設次數是6w多次,我有點懵逼,搜了一下這個加鹽hash疊代次數,有點懂了需要耗費cpu來進行這麼多次加字元串計算,可是我們的項目需求隻是能實作加密就可以啦,于是又找源碼,看看這個預設次數定義在哪裡(貌似是什麼crypto.c對應的頭檔案還是啥的忘了,現在也懶得找了),後來找到,過段把次數修改為1000再編譯運作,就沒什麼延遲了。
如果有相同問題可以試試看 …
.
.
.
.
.
看了一下開頭,寫太爛了,修改一下,以下憑記憶手碼,有問題請忽略
sqlcipher是一個sqlite的封裝項目
sqlite開源版本沒有加解密功能,但作者有在源碼裡留下加解密接口(sqlite3_key/sqlite3_key_v2,sqlite3_rekey/sqlite3_rekey_v2),是以目前的加密方案就兩種:一是存儲時對資料進行加密,讀資料時再進行解密;二是擴充sqlite的加解密接口,是以許多sqlite加密方案開源庫都是基于這個的(你也可以自己擴充,不過加密學這些東西太難,要快速實作在工程中進行sqlite加密還是用開源的吧),包括wxsqlite、sqlcipher、sqlite官方收費版等。
是以sqlcipher源碼包含了sqlite源碼,除此還有其封裝sqlite的代碼。編譯sqlcipher即編譯了sqlite,libsqlcipher也可以當正常的sqlite庫用,sqlite包含的接口sqlcipher都支援。