正确使用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/数据库

相关文章
相关标签/搜索