Android数据库加密,加密应用里重要的信息,避免干坏事,坏人!
加密方案
SQLite不支持加密,应用中重要的数据账号密码等容易被泄露。
加密数据库内容
在存储数据时加密内容,在查询时进行解密。但是这种方式不能彻底加密,数据库的表结构等信息还是能被查看到,另外检索数据也是一个问题。
加密数据库文件
借助SQLCipher。SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能。
- 加密性能高、开销小,只要5-15%的开销用于加密
- 完全做到数据库100%加密
- 采用良好的加密方式(CBC加密模式)
- 使用方便,做到应用级别加密
- 采用OpenSSL加密库提供的算法
加密内容
介绍一些常用的加密数据的方式,可以通过这些方式加密存储的数据库内容。
加密算法 | 描述 | 优点 | 缺点 |
---|---|---|---|
DES,3DES | 对称加密算法 | 算法公开、计算量小、加密速度快、加密效率高 | 双方都使用同样密钥,安全性得不到保证 |
AES | 对称加密算法 | 算法公开、计算量小、加密速度快、加密效率高 | 双方都使用同样密钥,安全性得不到保证 |
XOR | 异或加密 | 两个变量的互换(不借助第三个变量),简单的数据加密 | 加密方式简单 |
Base64 | 算不上什么加密算法,只是对数据进行编码传输 | ||
SHA | 非对称加密算法。安全散列算法,数字签名工具。著名的图片加载框架Glide在缓存key时就采用的此加密 | 破解难度高,不可逆 | 可以通过穷举法进行破解 |
RSA | 非对称加密算法,最流行的公钥密码算法,使用长度可变的秘钥 | 不可逆,既能用于数据加密,也可以应用于数字签名 | RSA非对称加密内容长度有限制,1024位key的最多只能加密127位数据 |
MD5 | 非对称加密算法。全程:Message-Digest Algorithm,翻译为消息摘要算法 | 不可逆,压缩性,不容易修改,容易计算 | 穷举法可以破解 |
加密文件
集成
AndroidStudio的Module中build.gradle添加SQLCipher的依赖
1 | compile 'net.zetetic:android-database-sqlcipher:3.5.7' |
GreenDao加密
GreenDao有加密的接口,使用非常方便,在GreenDao初始化的时候启动加密模式。
非加密模式
1
DaoMaster.OpenHelper.getWritableDatabase()
加密模式
1
DaoMaster.OpenHelper.getEncryptedWritableDb(key)
1
2
3DaoMaster.OpenHelper encryptedHelper = new DaoMaster.DevOpenHelper(this, VOD_DB, null);
// 选用设备唯一码作为加密的key
DaoSession encryptedDaoSession = new DaoMaster(encryptedHelper.getEncryptedWritableDb(getUniquePseudoID())).newSession();
注意
- 读取数据库时,key需要保存一致,否则,读出的数据为空
- 增删改查的数据库操作加密非加密模式下都是一样的。
SQLiteOpenHelper加密
使用SQLiteOpenHelper自己定义的接口
初始化SQLiteOpenHelper时,加载so库
1
2
3
4
5
6
7
8public class DBCipherHelper extends SQLiteOpenHelper {
public DBCipherHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
//不可忽略的 进行so库加载
SQLiteDatabase.loadLibs(context);
}
}使用
传统模式
1
2
3
4//获取可写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase();
//获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase();加密模式
1
2
3
4//获取写数据库
SQLiteDatabase db = dbHelper.getWritableDatabase(key);
//获取可读数据库
SQLiteDatabase db = dbHelper.getReadableDatabase(key);