1.SQLCipher介绍
SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里仅介绍Android中SQLCipher在greenDAO3.2.2的用法。
2.使用greenDAO3.2.2结合sqlcipher加密数据库说明
greenDAO从3.0.0版本开始就支持sqlcipher
image
3.加密数据库的使用
在我们做全局初始化的时候,如果不做加密,调用getWritableDatabase()方法获取未加密的SQLiteDatabase,如果我们需要做加密,只需要调getEncryptedWritableDb()方法获取加密的Database就可以,当我们只修改这一处时候,运行会发现报以下错误:
image
原因:greenDAO3.2.2中没有引入sqlcipher加密库,我们需要在自己的工程中引入该库
image
至此,我们加密数据库已经完成,是不是很简单。
4.源码查看分析
-
通过查看getEncryptedWritableDb()方法的源码我们发现,getEncryptedWritableDb()方法是通过EncryptedHelper类获取的Database,而EncryptedHelper类是集成net.sqlcipher.database.SQLiteOpenHelper(该类由sqlcipher库提供),所以我们的要使用加密数据库,必须依赖sqlcipher库。
image
image -
通过跟踪DevOpenHelper类的onUpgrade()方法,我们发现,我们做数据库升级的时候,最终调用的是DatabaseOpenHelper类的onUpgrade()方法,但是该类中的onUpgrade()方法体中没有任何代码,升级方法留给子类
image
而我们做加密数据库升级的时候,onUpgrade()方法是在EncryptedHelper中调用
image
因此在升级方法中获取到的Database 是已经解密的,然后交给MigrationHelper做数据转移。
网友评论