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/

正确使用SQLCipher来加密Android数据库的更多相关文章

  1. [转]正确使用SQLCipher来加密Android数据库 - 朝野布告

    参考文档:http://www.tuicool.com/articles/eYNFbuA Android本身自带有不加密的数据库SQLite,如果要保存密码之类的敏感数据在本地的话方法一是使用字段加密 ...

  2. Cocos2dx使用wxsqlite开源加密SQLite3数据库

    最近使用wxsqlite加密sqlite3数据库,刚开始折腾好几天,在xcode上一直编译不通过,后来在sqlite3.c找到配置,编译顺利通过,太激动了,哈哈,废话少说!总结一下android和io ...

  3. DotNet 资源大全中文版,内容包括:编译器、压缩、应用框架、应用模板、加密、数据库、反编译、IDE、日志、风格指南等

    DotNet 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-dotnet 是由 quozd 发起和维护.内容包括:编译器. ...

  4. 爱加密Android APk 原理解析

    转载请标明出处:http://blog.csdn.net/u011546655/article/details/45921025 爱加密Android APK加壳原理解析 一.什么是加壳? 加壳是在二 ...

  5. Android数据库专家秘籍(七)经验LitePal查询艺术

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40153833 经过了多篇文章的学习,我们已经把LitePal中的绝大部分内容都掌握 ...

  6. Android 数据库框架总结(转)

    转自 http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完 ...

  7. 自己动手写Android数据库框架

    前言 相信不少开发人员跟我一样,每次都非常烦恼自己写数据库,并且那些数据库语句也经常记不住.当然网上也有非常多非常好的数据库框架,你能够直接拿来用,可是 非常多时候我们的项目.特别是一个小型的Andr ...

  8. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

  9. Android 数据库框架 DBFlow 的使用

    原文首发于微信公众号:jzman-blog,欢迎关注交流! DBFlow 是一个基于注解处理器开发的使用方便的 ORM Android 数据库,该库简化了很多多余的代码,并且提供了好用的 API 来处 ...

随机推荐

  1. 【maven】如何将一个已有的jar文件,生成maven坐标,并上传至远程仓库

    [一]如何将一个已有的jar文件,生成maven坐标 使用maven构建项目需要在项目中引入自定义的一些包,也像maven一样在工程的pom.xml中引入相应的坐标,这时候我们就要自己把包上传到本地仓 ...

  2. GIS自定义地理处理工具--极值提取

    GIS自定义地理处理工具--极值提取 关键词:最大值提取,最小值提取,极值提取,极小值提取,极大值提取 商务合作,科技咨询,版权转让:向日葵,135—4855__4328,xiexiaokui#qq. ...

  3. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  4. [原][osg][OSGEARTH]OE的关闭打开自动计算裁剪面被OE的海洋ocean影响

    在osgEarthUtil 下 Ocean.cpp 的  traverse函数中: // we don't want the ocean participating in the N/F calcul ...

  5. 十一、postman接口测试(安装nodejs和npm)

    cmder安装:https://cmder.net/ node安装:https://nodejs.org/zh-cn/ 打开cmd命令,在命令提示窗输入 npm install -g cnpm --r ...

  6. java8 数据集过滤removeIf和filter

    对象如下,需求:只要30岁以下的人 //求职者的实体类 public class Person { private String name;//姓名 private Integer age;//年龄 ...

  7. DRBD UpToDate/DUnknown 故障恢复

    故障如下: root@drbd1:~# drbd-overview 0:data/0 StandAlone Primary/Unknown UpToDate/DUnknown /data/mysql ...

  8. extends 类的继承 / super关键字,调用继承类里面的函数和变量

    Son 继承Father 当其他脚本想调用 Father类里面的变量 or 方法 可以把 Son r=new Son()   等价于 Father r=new Father() 注意: 函数只能单继承 ...

  9. .Net MVC 下载网站的文件

    目录 前言 C#文件的下载 ajax 返回文件路径,使用window.open打开 前言 上传文件我使用的是Bootstrap的插件FileInput,这个抽时间看看写个博客 现在下载我遇到坑了,而这 ...

  10. mssql的update :from语法

    一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS    S ...