天天看點

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都支援。