1. 程式人生 > >sqlcipher 命令列給db外部加密的實現

sqlcipher 命令列給db外部加密的實現

關於Sqlcipher的加密解密

本文主要實驗目的:外部用sqlcipher命令列給已有的資料庫檔案加密,而在Android程式中解密應用。

1. 首先 sqlcipher命令列Linux環境搭建

https://www.zetetic.net/sqlcipher/下載原始碼。

或者

  1. 1.解壓  
  2. unzip -q sqlcipher-master.zip  
  3. cd sqlcipher-master  
  1. 2.編譯  
  2. ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"  
  3. 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差不多的用法

  1. ./sqlcipher test.db  #建立一個db檔案  
  2. sqlite> PRAGMA key = 'test';  #設定密碼  
  3. sqlite> .e  #退出  


三、把沒加密的db檔案進行加密步驟:

  1. 1.先用sqlite開啟db檔案  
  2. sqlite3 test.db  
  1. 2.把資料導成sql格式  
  2. sqlite> .output test.sql  
  3. sqlite> .dump  
  4. sqlite> .e  
  1. 3.加密  
  2. ./sqlcipher test2.db  #建立一個新的db檔案  
  3. sqlite> PRAGMA key = 'test';  #設定密碼  
  4. sqlite> .read test.sql  #匯入資料  
  5. sqlite> .e  #退出  


完成,生成的test2.db檔案就是一個加密過的db檔案了。

以上是前期使用過程,後面講述遇到的問題。

1、如何判斷是否有加密過?

  1. ./sqlcipher test.db #沒加密過的  
  2. sqlite> .schema  
  3. CREATE TABLE XXXXXX...  #顯示了表的建立語句  
  1. ./sqlcipher test2.db #沒加密過的  
  2. sqlite> .schema  
  3. Error: file is encrypted or is not a database  
對於加密過的db檔案,如果不先輸入密碼,後續關於資料庫的操作都不能執行,都會出現Error: file is encrypted or is not a database錯誤

3. 將加密好的檔案copy至Android終端下,通過Android程式碼入口可以成功訪問資料庫檔案。

android sqlcipher使用詳情參見上一篇文章