sqlcipher 命令列給db外部加密的實現
關於Sqlcipher的加密解密
本文主要實驗目的:外部用sqlcipher命令列給已有的資料庫檔案加密,而在Android程式中解密應用。
1. 首先 sqlcipher命令列Linux環境搭建。
https://www.zetetic.net/sqlcipher/下載原始碼。
或者
- 1.解壓
- unzip -q sqlcipher-master.zip
- cd sqlcipher-master
- 2.編譯
- ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
- make
編譯完就會出現一個sqlcipher的可執行檔案。
說明,在ubuntu12.04環境下configure sqlcipher 會出現諸多error,經過反覆查詢問題,發現原來是編譯環境缺少東西,主要缺少openssl相關庫:
(ubuntu12.04下預設的gcc,g++為 4.6.3 configure時候老是找不著,試著重灌gcc/g++ 4.4 ,congifure成功)。
sudo apt-get install openssl
sudo apt-get install libssl-dev
以及gcc也做了不同版本的測試。
最終configure完成後,make的過程又出現一些莫名其妙的error, 在標頭檔案以及alter.c檔案缺少* )之類的。
由於堅信原始碼不會有什麼問題,肯定是編譯過程哪裡出的毛病,所以回頭看看configure,發現出現 tclsh cannot found的警告。
於是 apt-get install tclsh8.5 安裝完成。($ sudo apt-get install tcl tk)
刪除之前編譯的工程,重新configure 以及make。終於編譯通過,成功生成sqlcipher可執行檔案。
2. Sqlcipher使用
(當然,如果沒有安裝Sqlite3 ,還需要apt-get install 安裝一下)
和sqlite差不多的用法
- ./sqlcipher test.db #建立一個db檔案
- sqlite> PRAGMA key = 'test'; #設定密碼
- sqlite> .e #退出
三、把沒加密的db檔案進行加密步驟:
- 1.先用sqlite開啟db檔案
- sqlite3 test.db
- 2.把資料導成sql格式
- sqlite> .output test.sql
- sqlite> .dump
- sqlite> .e
- 3.加密
- ./sqlcipher test2.db #建立一個新的db檔案
- sqlite> PRAGMA key = 'test'; #設定密碼
- sqlite> .read test.sql #匯入資料
- sqlite> .e #退出
完成,生成的test2.db檔案就是一個加密過的db檔案了。
以上是前期使用過程,後面講述遇到的問題。
1、如何判斷是否有加密過?
- ./sqlcipher test.db #沒加密過的
- sqlite> .schema
- CREATE TABLE XXXXXX... #顯示了表的建立語句
- ./sqlcipher test2.db #沒加密過的
- sqlite> .schema
- Error: file is encrypted or is not a database
3. 將加密好的檔案copy至Android終端下,通過Android程式碼入口可以成功訪問資料庫檔案。
android sqlcipher使用詳情參見上一篇文章