[DB那些事]数据库加密
说到数据库加密,目前最好且唯一的方案就是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.com/Stay/ormlite-sqlcipher
p.s. 如果你现在使用的ormlite版本不是4.48,那么就自己动手把对应的ormlite-android的源代码拉下来手动替换。
[DB那些事]数据库加密的更多相关文章
- Android DB那些事-数据库加密
说到数据库加密,目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它.开源,且支持很多平台. 单就Android来说,集成不算太麻烦,1个jar包,3个so库,1个zip. ...
- Android数据存储之SQLCipher数据库加密
前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...
- IOS 使用wxsqlite3为sqlite3数据库加密
1,下载wxsqlite3 地址http://jaist.dl.sourceforge.net/project/wxcode/Components/wxSQLite3/wxsqlite3-3.1.1. ...
- Android Sqlite数据库加密
Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...
- SQL2012数据库加密方法
1.非对称密钥来保护新的对称密钥 /*--测试环境 Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) Oct 19 2012 13:38:57 C ...
- iOS 使用FMDB SQLCipher给数据库加密
关于SQLite,SQLCipher和FMDB SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案 ...
- Android 数据库加密
一 一个简短的引论 SQLite是一个轻量的.跨平台的.开源的数据库引擎.它的读写效率.资源消耗总量.延迟时间和总体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方式(如Android.i ...
- c# sqlite 数据库加密
c# sqlite 数据库加密 2010-05-29 10:55 用了ADO.NET 2.0 SQLite Data Provider这样可以直接利用它来创建一个加密的sqlite数据库.有关c#代码 ...
- python连接数据库(pymysql)及数据库加密
内容: 1.pymysql介绍 2.pymysql基本使用 3.数据库加密 参考:http://www.cnblogs.com/wupeiqi/articles/5713330.html 1.pymy ...
随机推荐
- CSS3实现元素旋转
-webkit-transform:rotate(30deg); 参数代表顺时针自旋转角度 这个元素还提供了文本倾斜的方法 - HTML5与CSS3 P299
- c#指定日期格式
string TripCode = "BT"+DateTime.Now.ToString("yyyyMMddHHmmss");//出差单号
- HDU 5821 Ball (贪心排序) -2016杭电多校联合第8场
题目:传送门. 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组. 题 ...
- 解决Odoo出现的Unable to send email, please configure the sender's email address or alias.
这是由于当前登录用户的邮件地址信息缺失造成的,需要设置其邮件地址. 方法:使用创建该用户的管理员帐号登录系统,开启技术特性,在需要设置邮箱地址的用户界面点击相关的业务伙伴标签链接,如图所示:
- balabalabala
[微分享]:种子不落在肥土而落在瓦砾中,有生命力的种子决不会悲观和叹气,因为有了阻力才有磨炼.
- July 7th, Week 28th Thursday, 2016
The 79th Anniversary of Anti-Japan War Difficulties vanish when faced bodly. 勇敢面对困难,困难自会退让. The best ...
- QRTZ_表注释
QRTZ_CALENDARS 存储Quartz的Calendar信息QRTZ_CRON_TRIGGERS 存储CronTrigger,包括Cron表达式和时区信息QRTZ_FIRED_TRIGGERS ...
- Linq查询
//Linq查询 List<A1> a1 = new List<A1>(); a1.Add(, Name = , Gender = true }); a1.Add(, Name ...
- Linux中LoadAverage分析
判断系统负荷 1.uptime 命令,load average的三个数分别表示了1分钟.5分钟.15分钟的平均进程数. 如果你继续看手册,它还会告诉你,当CPU完全空闲的时候,平均负荷为0:当CPU工 ...
- Mysql 删除语句
手册: 14.2.2 DELETE Syntax 单表删除语句:DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [PARTITION (par ...