说到数据库加密,目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它。开源,且支持很多平台。

  单就Android来说,集成不算太麻烦,1个jar包,3个so库,1个zip。

  jar包中基本上重写了android.database.sqlite包中所有的类,全部替换成了net.sqlcipher.sqlite包。why?因为sqlcipher加密后,需要密码才能打开该数据库。所以它把所有的都重写了一遍,这是一个坑,一会Stay再来说明。

  整体来说sqlcipher还是比较好用的,封装好了跟正常操作数据库的方式一样,只是在getWritableDatabase()时要多传个password参数。

  sqlcipher在性能上没有太大的损失,而且在移动端数据量不是很大,基本可以忽略不计了。

  现在坑来了,假如你之前用的是数据库框架,而不是使用原生的方式,那么集成起来还有些麻烦。当然如果用的对象型数据库,那跟sqlcipher就一点关系都没有了。我们这里只说,如果以前用的是基于sqlite的数据库框架集成sqlcipher。

  比如,ormlite,它是object-relation-mapping,将你model中声明的变量通过注解的方式和数据库的表字段一一对应起来。

  这个映射不在乎数据库是sqlite,mysql还是什么。在ormlite-core核心包中,与数据库的连接是个proxy,在对应的ormlite-android中来使用android系统提供给我们的db连接方式来实现这个proxy。这就是为什么ormlite要有两个jar包。

  如果要使用sqlcipher,那么所有android.database.sqlite中的类都要换成net.sqlcipher.sqlite中的类。但是ormlite-android中用的都是android.database.sqlite。这是个问题。对吧?

  所幸ormlite分成了两个包,ormlite-core.jar, ormlite-android.jar 并且它们还是开源的。我们可以把ormlite-android.jar中所有引用android.database.sqlite的地方手动替换为net.sqlcipher.sqlite。这个注意不错吧?

  也就是说。ormlite-core.jar不变,照样导入这个jar,只是ormlite-android.jar要改成sqlcipher.jar中的那些Cursor, SqliteDatabase等等。

  确定好解决方案之后,剩下的就好办了。

  这里说android studio的集成方式,如果是eclipse可以直接新建一个工程,做成library。

  首先,新建一个module,因为会改很多东西,所以尽量单独放一个module,以后做其他项目可以方便迁移。

  

  导入sqlcipher,配置好环境。确保sqlcipher没问题,能正确的加解密,进行crud。

  导入ormlite-core.jar, 建议使用android studio的jcenter仓库来导入

  

  去ormlite的github主页,把ormlite-android的源代码拉下来,只需要ormlite-android就可以了。

  注意。要用git拉代码,别download as zip。你需要手动切换到对应的commit上。比如ormlite-core.jar版本是4.48,那么对应的ormlite-android也应该切换到4.48的tag上。保证两个版本一致。

  将所有ormlite-android中的代码copy到你的module/src目录下,然后手动将所有import android.database.sqlite的地方手动替换为import net.sqlcipher.sqlite

  

  改为之后会有一个错误,因为sqlcipher需要密码去getWritableDatabase(String password),这里需要对源码做些修改,如下图。

  

  当然还有其他的小错误,自己想办法解决好了,不难。

  在自己的主app module中要继承的SqliteOpenHelper还是OrmliteSqliteOpenHelper,sqlcipher已经集成到ormlite内部了,对外不可见。你只需要用带有password的构造方法就可以了。如下图。

  

  其他调用方式都不用变了。以前写的ormlite代码都不用换了。开森,对不对。

  代码已经放到github上了。

  github

  p.s. 如果你现在使用的ormlite版本不是4.48,那么就自己动手把对应的ormlite-android的源代码拉下来手动替换。

Android DB那些事-数据库加密的更多相关文章

  1. [DB那些事]数据库加密

    说到数据库加密,目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它.开源,且支持很多平台. 单就Android来说,集成不算太麻烦,1个jar包,3个so库,1个zip. ...

  2. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  3. Android Sqlite数据库加密

    Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...

  4. Android 数据库加密

    一 一个简短的引论   SQLite是一个轻量的.跨平台的.开源的数据库引擎.它的读写效率.资源消耗总量.延迟时间和总体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方式(如Android.i ...

  5. Android数据库加密之sqlciher方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6241964.html 前言 大家好,我是Cavalier ...

  6. iOS 使用FMDB SQLCipher给数据库加密

    关于SQLite,SQLCipher和FMDB SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案 ...

  7. Android开发学习——SQLite数据库与单元测试

    SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHelper  public class Myopenhelper extends SQLiteOpenHelp ...

  8. IOS 使用wxsqlite3为sqlite3数据库加密

    1,下载wxsqlite3 地址http://jaist.dl.sourceforge.net/project/wxcode/Components/wxSQLite3/wxsqlite3-3.1.1. ...

  9. Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用

    一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ...

随机推荐

  1. python pip命令技巧

    确保本地开发环境,和线上一致性 1.导出当前解释器的模块pip3 freeze > requirements.txt 2.将这个文件requirements.txt,上传至服务器,在新的虚拟环境 ...

  2. 从CPU/OS到虚拟机和云计算

      从CPU/OS到虚拟机和云计算  作者:张冬            关于软硬件谁为主导这个话题,套用一句谚语就是三十年河东三十年河西.风水轮流转.软件和硬件一定是相互促进.相互拆台又相互搭台的. ...

  3. Git Extension工具安装及使用

    以下界面所示的三个工具,如果没安装过,则勾上让其安装.MsysGit为Git的Windows版本,必须要安装:Kdiff为对比/合并工具,可选安装,可以换为使用其它的相关工具:最后一个Windows ...

  4. lock,Monitor,Mutex的区别

    lock和Monitor的区别 一.lock的底层本身是Monitor来实现的,所以Monitor可以实现lock的所有功能. 二.Monitor有TryEnter的功能,可以防止出现死锁的问题,lo ...

  5. JDK 注解详解

    注解用途 我们在使用spring MVC框架时用到了很多的注解,如:@Controller.@RequestMapping等等,spring框架通过反射获取到标签进行不同的逻辑处理.注解是代码的附属信 ...

  6. java 多线程 day11 lock

    import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock; /** * Create ...

  7. linux 下路由配置

    转自 https://www.cnblogs.com/kevingrace/p/6490627.html 在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:----- ...

  8. 重新编写equals()方法,hashCode()方法,以及toString(),提供自定义的相等标准,以及自描述方法

    下面给出一个实例,重新编写equals()方法,提供自定义的相等标准 public class PersonTest { public static void main(String[] args) ...

  9. Redhat 7.4更新为Centos7的yum并安装docker-ce

    以下命令请在root下执行 #删除原有的yum rpm -qa|grep yum|xargs rpm -e --nodeps #install centos yum #wget http://mirr ...

  10. NGUI混合FingerGesture《卷一》 统一坐标

    问题背景 使用FingerGesture 获取触碰点2D坐标, 将该2D坐标赋值给NGUI元素,发现位置出现偏差. 排查思路 1:NGUI的 (0,0,0)默认位置是在屏幕正中心.而FingerGes ...