sqlcipher開源項目的ubuntu編譯和交叉編譯

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測試官方網站上的文檔其實寫清楚了,貼上部分

  1. 創建加密數據庫
    $ 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

  2. 打開加密數據庫
    $ 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);

  3. 修改數據庫密碼
    sqlite> PRAGMA rekey = ‘newkey’;

  4. 加密已有的數據庫
    $ 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;

  5. 解密數據庫
    $ 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都支持。

發佈了38 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章