Android本身自帶有不加密的數(shù)據(jù)庫SQLite,如果要保存密碼之類的敏感數(shù)據(jù)在本地的話方法一是使用字段加密解密算法,,方法二是整個數(shù)據(jù)庫都加密掉,。如果只是加密解密某個字段(如數(shù)據(jù)庫)就推薦使用第一種方法,輕便易用;如果想要整個數(shù)據(jù)庫都加密的話,,就推薦方法二了,,使用其他的數(shù)據(jù)庫SQLite,如SQLCipher,,其是實現(xiàn)加密了的SQLite數(shù)據(jù)庫,,使用方法與Android自帶的大部分一樣,就需要注意以下步驟,,否則加密不成功,。
這里講的是SQLCipher for Android v2.2.2版本,使用的是AES加密,,本人通過自己的探索和文章參考總結(jié)出來一下步驟和注意事項,。
-
官方下載最新版本:
http:///
,本文所講版本實現(xiàn)加密功能后增大了6MB,,最新版本比較大,,但是能保證對Android版本的兼容性。
源文件(可自由編譯):
git clone https://github.com/sqlcipher/android-database-sqlcipher.git
二進制文件:
SQLCipher For Android
-
下載好二進制文件解壓后,,將里面對應(yīng)的.zip、.so,、.jar文件復(fù)制到對應(yīng)的工程文件夾,,如assets文件夾里的icudt46l.zip復(fù)制到工程的assets文件夾,完成,,應(yīng)該是與喜愛的樣子:
-
接下來,,針對libs文件夾里面加入的三個jar包(commons-codec.jar, guava-r09.jar 和 sqlcipher.jar)來Build path,如圖:
-
接下來如果你已經(jīng)使用了Android自帶的SQLite數(shù)據(jù)庫,,那么這部就是替換工作,,否者就是包引用工作,即將
android.database.sqlite.SQLiteDatabase的import替換為
net.sqlcipher.database.SQLiteDatabase,,如果實現(xiàn)了SQLiteOpenHelper也要修改為import net.sqlcipher.database.SQLiteOpenHelper,,反正就是
import中包含
android.database.sqlite.*
都替換成
info.guardianproject.database.sqlite.*
。import android.database.Cursor則不需要替換,。
-
接下來的關(guān)鍵一步是添加加密密匙,,添加方法是實現(xiàn)getWritableDatabase("thisismyencryptstringkey"),參數(shù)是字符串類型,,如果為""的話表示不加密,,這里要注意的是不能包含逗號否者也是實現(xiàn)不了加密的。
-
接下來在使用數(shù)據(jù)庫的Activity,,至少需要加入引入一下import(假設(shè)有DBManger或者DBHelper之類的封裝工具,,其要多加入import net.sqlcipher.database.SQLiteOpenHelper,來通過SQLiteOpenHelper聲明、創(chuàng)建數(shù)據(jù)庫):
import net.sqlcipher.database.SQLiteDatabase;
-
接下來還是關(guān)鍵一步,,還是在Activity,,里面的onCreate方法加入,而且應(yīng)該是最先加入的(要早于實例化數(shù)據(jù)庫,,這個是為了引入包里面的so文件以進行引用,,否者會出現(xiàn)各種implementation、dbopen,、UnsatisfiedLinkError的問題):
SQLiteDatabase.loadLibs(this);//涉及到數(shù)據(jù)庫必須使用而且需要先聲明才能執(zhí)行以下實例化的數(shù)據(jù)庫
- 完成,,測試吧,騷年,!
關(guān)于SQLCipher的編譯,,可參考:
1、為跨平臺數(shù)據(jù)庫引擎 SQLite 實現(xiàn)加密擴展
https://sites.google.com/site/notegainexp/sqlite/weikuapingtaishujukuyinqingsqliteshixianjiamikuozhan
2,、SQLite加密--SQLCipher
http://stormzhang./blog/2013/06/16/sqlite-encrypt/
|