1. 程式人生 > >sqlcipher開源專案的ubuntu編譯和交叉編譯

sqlcipher開源專案的ubuntu編譯和交叉編譯

sqlcipher是一個對sqlite資料庫進行aes256加密的開源庫,其強大的跨平臺性讓它被許多知名企業使用,例如三星、摩托羅拉、蘋果等等,從ios2-ios6蘋果一直採用sqlcipher,安卓平臺可以支援os2.x-os4.4.
專案本身不提供加密演算法,呼叫openssl的aes加密演算法,其官方稱只要能使用sqlite、有openssl庫的平臺都可使用sqlcipher。

解壓原始碼到ubuntu下,進入openssl原始碼根目錄
./config shared –prefix=/home/xxxxx
make && make install

在/home/xxxxx目錄即生成了openssl的相關動態、靜態庫,將庫拷貝到系統預設庫目錄
cp openssl/lib/* /usr/lib/

解壓原始碼到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都支援。