SQLCipher 命令行使用 後臺加密

此次遇到的問題是,手機終端須要加密sqlite的db文件,防止被別人看到相關數據,而且db文件在多個終端可使用。linux

在網上找到的辦法是使用第三方工具SQLCipher。git

根據需求,要在後臺系統生成相關加密完的db文件以供終端下載使用。github

一開始也是一頭霧水,在網上找了不少資料,寫得不是很詳細。sql

1、先把通用的編譯過程寫一下:數據庫

https://github.com/sqlcipher/sqlcipher下載zip包,在linux系統下編譯運行。服務器

1.解壓
unzip -q sqlcipher-master.zip
cd sqlcipher-master


2.編譯

./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"
make


編譯完就會出現一個sqlcipher的可執行文件。工具

2、使用SQLCipher加密

和sqlite差很少的用法spa

./sqlcipher test.db  #建立一個db文件

sqlite> PRAGMA key = 'test';  #設置密碼

sqlite> .e  #退出


3、把沒加密的db文件進行加密步驟:code

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文件了。

 

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

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

./sqlcipher test.db #沒加密過的
sqlite> .schema
CREATE TABLE XXXXXX...  #顯示了表的建立語句

 

./sqlcipher test2.db #沒加密過的
sqlite> .schema
Error: file is encrypted or is not a database

對於加密過的db文件,若是不先輸入密碼,後續關於數據庫的操做都不能執行,都會出現Error: file is encrypted or is not a database錯誤。

 

二、生成的db文件使用問題

將生成的db文件發給終端,發現不能使用,報錯都是Error: file is encrypted or is not a database。

終端生成一個db文件,放到另一臺手機上,也不能使用。

將生成的db文件放到另一臺服務器上使用,能夠正常使用。懷疑是sqlcipher的版本不一致。在github上查看,下載的這個master版多是v3.2.0的,又去下載tag爲v3.0.0的編譯運行,可使用,再次去下載tag爲v2.2.1的版本編譯運行,db文件不能正常使用,因而肯定,不一樣的版本生成的db文件可能不兼容。

再次嘗試,2.2.1生成的db文件能夠在終端正常使用,終端用的版本可能也是2.2的,因而,愉快地使用2.2.1的版本去生成db文件。

 

結束。

相關文章
相關標籤/搜索