Android数据库加密

Android数据库加密
一、简介
SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的读写效率、资源消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如Android、iOS)。Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作,具体就不详细说明了。
然而,Android平台自带的SQLite有一个致命的缺陷:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。如果是普通的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的应用就会面临严重的安全漏洞隐患。
二、数据库加密原理
目前主流的数据库都采用了各种安全措施,主要包括用户认证、访问控制、数据加密存储和数据库操作审计等措施。
用户认证:用户或者程序向数据库提供自己的有效身份证明,数据库鉴别用户的身份是否合法,只有合法的用户才能存取数据库中的数据。用户认证是所有安全机制的前提,只有通过认证才能进行授权访问和审计。
访问控制:数据库管理系统为不同的用户分配不同的权限,保证用户只能进行授权的访问。目前,一些大型数据库(如Oracle等)都采用了基于角色的访问控制机制,即为用户授予不同的角色,如db—owner,security administrator 等,不同的角色允许对数据库执行不同的操作。
数据库加密:用户认证以及访问控制对访问数据库进行了控制,但攻击者可能会利用操作系统或数据库漏洞,或物理接触计算机,而直接接触数据库系统文件,从而可能绕过身份认证和存取控制而直接窃取或篡改数据库内容。对数据库中的数据进行加密是防范这类威胁的有效手段。
数据库操作审计:监视和记录用户对数据库所做的各种操作的安全机制,它记录并存储用户的操作,用于事后分析,以检查导致数据库现状的原因以及提供追踪攻击者的线索。数据库的备份与恢复:当数据库发生不可恢复的故障时,可以将数据库恢复到先前的某个一致性的状态。
三、解决方案
1.将数据加密后再写入数据库:
1)优点:
a. 实现数据加密快速,只需添加两个方法
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据
b. 程序无需进行太大变动,仅在对数据进行添加,修改,删除,查询时。针对指定的表字段进行修改进行加密,解密的字段即可。
2)不足:
a. 由于对数据进行了加密。所以为了看到明文,必须密文进行解密。因此会增加处理器的消耗。因终端手机的处理能力有限,可能会出现处理数据缓慢的现象发生。
b. 仅仅对数据进行了加密,还是可以看到数据表的sql语句,可能猜测到表的作用。另外,如果没有对一个表中的所有字段加密,则可以看没有加密的明文数据。
这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题,这种只是靠存取数据库时通过自己的一些算法加密解密,一定程度上会影响性能。
这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
2. 对数据库文件加密
将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。
目前流行的是一款开源的SQLite加密工具 SQLCipher ,微信也在使用。 SQLCipher是完全开源的,其代码托管在github上。SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,也增加了一些自己的接口。它有一个缺点就是使用该库之后会导致Apk会变大6M左右。下面就是具体介绍SQLCipher的使用方法。
三、SQLCipher使用
1.下载SQLCipher源文件
在命令行使用:git clone git://github.com/sqlcipher/android-database-sqlcipher.git
2.下载库文件
浏览器下载:https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v2.2.2.zip
3.SQLCipher库使用
1)解压现在文件可以得到,所需要的库文件在lib和assets文件夹下
Android数据库加密_第1张图片
2)导入到Android工程中
a.首先将assets目录下的icudt46l压缩包拷贝到对应Android工程下的assets目录下
这里写图片描述
b. 然后将lib下面文件夹中的so库导入到对应Android工程中
Android数据库加密_第2张图片
到这里准备工作就全部完成了,接下来就是使用SQLCipher编写代码。
3)使用SQLCipher数据库
SQLCipher数据库用法相比于Android原生数据库用法,除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。只是导包的时候替换成SQLCipher的数据库文件,如下:
Android数据库加密_第3张图片
讲白了,所有有关数据库的代码,只要修改引入的包成SQLCipher的包,就可以完美替换,在用法上只有两个注意点,其余的一模一样。下面介绍两个不同点,其余的数据库操作大家都比较熟悉,用法也一样,我就不多作介绍了。
a.初始化时需要初始化库:必须先调用SQLiteDatabase.loadLibs(context);然后再执行数据库相关的操作,建议在Application中初始化,或者在初始化单例SQLiteOpenHelper的时候初始化。
b.获取数据库db对象时需要传入key:
db = sqLiteOpenHelper.getWritableDatabase(password);
这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
4)检查加密效果
a. 在Root过的手机,通过数据库编辑器查看改应用的数据库:
Android数据库加密_第4张图片
可以发现找不到数据库文件,数据库文件已经被包装过了。
b. 从命令行进入手机,查看数据库:
adb shell
cd /data/data/com.example.sqlcipherdemo/databases
sqlite3 demo.db
.table
结果:Error:file is encrypted or is not a database,可以发现找不到数据库文件,数据库文件已经被包装过了。

你可能感兴趣的:(Android,sqlite,数据库加密)