此次遇到的問題是,手機終端須要加密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文件。
結束。