关于android sqlite 加密的研究,androidsqlite
最近需要研究一下Android系统下数据库文件的加密。
首先调研一下几种方案:
http://blog.csdn.net/fg313071405/article/details/26684261
(一)
关于SQLite
SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。 然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。比如国内某团购iOS客户端的DB缓存数据就一览无余:SQLite加密方式 对数据库加密的思路有两种: 1. 将内容加密后再写入数据库 这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。 不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。 2. 对数据库文件加密 将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。 SQLite加密工具 目前网上查询到iOS平台可用的SQLite加密工具有以下几种: SQLite Encryption Extension (SEE) 事实上SQLite有加解密接口,只是免费版本没有实现而已。而SQLite Encryption Extension (SEE)是SQLite的加密版本,提供以下加密方式:
- RC4
- AES-128 in OFB mode
- AES-128 in CCM mode
- AES-256 in OFB mode
| asier to setup, saving many steps in project configuration pre-built with a modern version of OpenSSL, avoiding another external dependency much faster for each build cycle because the library doesn't need to be built from scratch on each compile (build time can be up to 95% faster with the static libraries) |
- NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
- stringByAppendingPathComponent: @"cipher.db"];
- sqlite3 *db;
- if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
- const char* key = [@"BIGSecret" UTF8String];
- sqlite3_key(db, key, strlen(key));
- int result = sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL);
- if (result == SQLITE_OK) {
- NSLog(@"password is correct, or, database has been initialized");
- } else {
- NSLog(@"incorrect password! errCode:%d",result);
- }
- sqlite3_close(db);
- }
- $ ./sqlcipher plaintext.db
- sqlite> ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'testkey';
- sqlite> SELECT sqlcipher_export('encrypted');
- sqlite> DETACH DATABASE encrypted;
- $ ./sqlcipher encrypted.db
- sqlite> PRAGMA key = 'testkey';
- sqlite> ATTACH DATABASE 'plaintext.db' AS plaintext KEY ''; -- empty key will disable encryption
- sqlite> SELECT sqlcipher_export('plaintext');
- sqlite> DETACH DATABASE plaintext;
(二)关于SQLCipher 各个平台下的文档以及代码(主要看了一下Android平台下的使用) 链接如下:
https://www.zetetic.net/sqlcipher/sqlcipher-for-android/
(三)实践: 参考 http://www.tuicool.com/articles/eYNFbuA
Android本身自带有不加密的数据库SQLite,如果要保存密码之类的敏感数据在本地的话方法一是使用字段加密解密算法,方法二是整个数据库都加密掉。如果只是加密解密某个字段(如数据库)就推荐使用第一种方法,轻便易用;如果想要整个数据库都加密的话,就推荐方法二了,使用其他的数据库SQLite,如SQLCipher,其是实现加密了的SQLite数据库,使用方法与Android自带的大部分一样,就需要注意以下步骤,否则加密不成功。
这里讲的是SQLCipher for Android v2.2.2版本,使用的是AES加密,本人通过自己的探索和文章参考总结出来一下步骤和注意事项。
- 官方下载最新版本: http://sqlcipher.net/ ,本文所讲版本实现加密功能后增大了6MB,最新版本比较大,但是能保证对Android版本的兼容性。
源文件(可自由编译):git clone https://github.com/sqlcipher/android-database-sqlcipher.git二进制文件: SQLCipher For Android
- 下载好二进制文件解压后,将里面对应的.zip、.so、.jar文件复制到对应的工程文件夹,如assets文件夹里的icudt46l.zip复制到工程的assets文件夹,完成,应该是与喜爱的样子:
- 接下来,针对libs文件夹里面加入的三个jar包(commons-codec.jar, guava-r09.jar 和 sqlcipher.jar)来Build path,如图:
- 接下来如果你已经使用了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则不需要替换。
- 接下来的关键一步是添加加密密匙,添加方法是实现getWritableDatabase("thisismyencryptstringkey"),参数是字符串类型,如果为""的话表示不加密,这里要注意的是不能包含逗号否者也是实现不了加密的。
- 接下来在使用数据库的Activity,至少需要加入引入一下import(假设有DBManger或者DBHelper之类的封装工具,其要多加入import net.sqlcipher.database.SQLiteOpenHelper,来通过SQLiteOpenHelper声明、创建数据库):
import net.sqlcipher.database.SQLiteDatabase; - 接下来还是关键一步,还是在Activity,里面的onCreate方法加入,而且应该是最先加入的(要早于实例化数据库,这个是为了引入包里面的so文件以进行引用,否者会出现各种implementation、dbopen、UnsatisfiedLinkError的问题):
SQLiteDatabase.loadLibs(this);//涉及到数据库必须使用而且需要先声明才能执行以下实例化的数据库
- 完成,测试!
- 官方下载最新版本: http://sqlcipher.net/ ,本文所讲版本实现加密功能后增大了6MB,最新版本比较大,但是能保证对Android版本的兼容性。
关于SQLCipher的编译,可参考:
1、为跨平台数据库引擎 SQLite 实现加密扩展 https://sites.google.com/site/notegainexp/sqlite/weikuapingtaishujukuyinqingsqliteshixianjiamikuozhan
2、SQLite加密--SQLCipher http://stormzhang.github.io/blog/2013/06/16/sqlite-encrypt/
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。