正確使用SQLCipher來加密Android數據庫

Android自己自帶有不加密的數據庫SQLite,若是要保存密碼之類的敏感數據在本地的話方法一是使用字段加密解密算法,方法二是整個數據庫都加密掉。若是隻是加密解密某個字段(如password)就推薦使用第一種方法,輕便易用;若是想要整個數據庫都加密的話,就推薦方法二了,使用其餘的數據庫SQLite,如SQLCipher,其是實現加密了的SQLite數據庫,使用方法與Android自帶的大部分同樣,就須要注意如下步驟,不然加密不成功。因爲本人使用的是Win平臺,對於SQLCipher的編譯什麼的就懶得去弄了,直接使用其二進制包了。android

這裏講的是SQLCipher for Android v2.2.2版本,使用的是AES加密,本人經過本身的探索和文章參考總結出來一下步驟和注意事項。git

 

  1. 官方下載最新版本:http://sqlcipher.net/,本文所講版本實現加密功能後增大了6MB,最新版本比較大,可是能保證對Android版本的兼容性。
    源文件(可自由編譯):
    git clone https://github.com/sqlcipher/android-database-sqlcipher.git

    二進制文件:SQLCipher For Androidgithub

  2. 下載好二進制文件解壓後,將裏面對應的.zip、.so、.jar文件複製到對應的工程文件夾,如assets文件夾裏的icudt46l.zip複製到工程的assets文件夾,完成,應該是與下面的樣子一致:
  3. 接下來,針對libs文件夾裏面加入的三個jar包(commons-codec.jar, guava-r09.jar 和 sqlcipher.jar)來Build path,如圖:
  4. 接下來若是你已經使用了Android自帶的SQLite數據庫,那麼這部就是替換工做,否者就是包引用工做,即將android.database.sqlite.SQLiteDatabase的import替換爲net.sqlcipher.database.SQLiteDatabase,若是實現了SQLiteOpenHelper也要修改成import net.sqlcipher.database.SQLiteOpenHelper,反正就是import中包含android.database.sqlite.* 都替換成info.guardianproject.database.sqlite.*。import android.database.Cursor則不須要替換。
  5. 接下來的關鍵一步是添加加密密匙,添加方法是實現getWritableDatabase("thisismyencryptstringkey"),參數是字符串類型,若是爲""的話表示不加密,這裏要注意的是不能包含逗號否者也是實現不了加密的。
  6. 接下來在使用數據庫的Activity,至少須要加入引入一下import(假設有DBManger或者DBHelper之類的封裝工具,其要多加入import net.sqlcipher.database.SQLiteOpenHelper,來經過SQLiteOpenHelper聲明、建立數據庫):
    import net.sqlcipher.database.SQLiteDatabase;
  7. 接下來仍是關鍵一步,仍是在Activity,裏面的onCreate方法加入,並且應該是最早加入的(要早於實例化數據庫,這個是爲了引入包裏面的so文件以進行引用,否者會出現各類implementation、dbopen、UnsatisfiedLinkError的問題):
  8. SQLiteDatabase.loadLibs(this);//涉及到數據庫必須使用並且須要先聲明才能執行如下實例化的數據庫

    /*fragment use this:
    *SQLiteDatabase.loadLibs(getActivity());//涉及到數據庫必須使用並且須要先聲明才能執行如下實例化的數據庫
    */
     
  9. 實例化數據庫後便可使用,完成 —— 使用過程當中記得結束Cursor和在onDestroy方法中關閉數據庫!測試吧,騷年!有嘛問題評論的,留言咯~
  10. 須要注意的是,若是你使用多個相似個繼承自DBHelper大的MyDBHelper或者相似的工具類,那麼即便加密的密匙相同你會發現他們是不能寫入相同數據庫的!即便不加密也不能夠,因此,若是使用多個MyDBHelper類(至關於執行了屢次dbOpenHelper.getWritableDatabase(YOURKEY)這句加密的語句),應當分開在不一樣的數據庫,或者合併這些類。

關於SQLCipher的編譯,可參考:算法

一、爲跨平臺數據庫引擎 SQLite 實現加密擴展 https://sites.google.com/site/notegainexp/sqlite/weikuapingtaishujukuyinqingsqliteshixianjiamikuozhansql

二、SQLite加密--SQLCipher http://stormzhang.github.io/blog/2013/06/16/sqlite-encrypt/數據庫

相關文章
相關標籤/搜索