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


Android本身自帶有不加密的數據庫SQLite,如果要保存密碼之類的敏感數據在本地的話方法一是使用字段加密解密算法,方法二是整個數據庫都加密掉。如果只是加密解密某個字段(如password)就推薦使用第一種方法,輕便易用;如果想要整個數據庫都加密的話,就推薦方法二了,使用其他的數據庫SQLite,如SQLCipher,其是實現加密了的SQLite數據庫,使用方法與Android自帶的大部分一樣,就需要注意以下步驟,否則加密不成功。由於本人使用的是Win平台,對於SQLCipher的編譯什么的就懶得去弄了,直接使用其二進制包了。

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

 

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

    二進制文件:SQLCipher For Android

  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的編譯,可參考:

1、為跨平台數據庫引擎 SQLite 實現加密擴展 https://sites.google.com/site/notegainexp/sqlite/weikuapingtaishujukuyinqingsqliteshixianjiamikuozhan

2、SQLite加密--SQLCipher http://stormzhang.github.io/blog/2013/06/16/sqlite-encrypt/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM