对于Room
数据库,SQLCipher
加密并不能够直接支持,因此CWAC-SafeRoom
便应运而生。
CWAC-SafeRoom
是一个用来方便Room
数据库加密的框架,该项目底层同样是采用SQLCipher
原理实现,只是更加适用于Room
数据库框架。
使用此框架,首先需要引入对应的lib包。
由于androidx的变动,该内容有着两个版本的包引入,分别适用于androidx版本和旧版的Android support包版本,示例如下:
repositories {
maven {
url "https://s3.amazonaws.com/repo.commonsware.com"
}
}
dependencies {
implementation "com.commonsware.cwac:saferoom.x:1.3.0"
}
repositories {
maven {
url "https://s3.amazonaws.com/repo.commonsware.com"
}
}
dependencies {
implementation "com.commonsware.cwac:saferoom:1.2.1"
}
在使用Room框架构建数据库时,获取数据库实例的方法如下:
val instance = Room.databaseBuilder(
context,
TestDataBase::class.java, DB_NAME)
.build()
如果需要使用SafeRoom时,则需要创建一个加密实例SafeHelperFactory
,传入具体的加密密码,然后在添加到Room
数据库实例对象的生成中,示例代码如下:
private const val PASSWORD = "123456"
...
// val factory: SafeHelperFactory = SafeHelperFactory.fromUser(EditText.getText()) //如果从输入框中获取密码,则可以使用此工厂方法
val factory = SafeHelperFactory(PASSWORD.toCharArray())
val instance = Room.databaseBuilder(
context,
TestDataBase::class.java, DB_NAME
)
.openHelperFactory(factory)
.build()
可以看到,在此框架中的加密密码是byte[]
或者char[]
类型的变量,而不是String
类型(考虑到String是不变的值)。
如果需要通过控件EditText
来获取具体的加密密码,框架提供了fromUser()
来获取。
在打开加密数据库之后,框架会将加密密码清零,如果是
fromUser()
获取的,还会清除控件中的内容。
如果之前项目内已经有采用Room创建的数据库,并且是没有在加密状态,直接采用上面的加密获取数据库实例去读取数据库文件是会出错的。出现的错误
因此如果需要采用加密,一般是需要去重新创建一个内容,然后进行数据迁移。
框架CWAC-SafeRoom
提供了能够十分方便的对当前已有数据库的加密和解密过程。
如果您已有使用Room或其他方式创建的SQLite数据库,则SQLCipherUtils该类具有getDatabaseState()
和encrypt()
方法。
getDatabaseState(Context, String)
方法用来获取数据库的加密状态,String为数据库名字。返回值包括:
如果未加密,可以采用encrypt(Context, String, byte[])
对数据库进行加密处理,其中String为数据库名字,byte[]为加密密码。
getDatabaseState和encrypt有多个重载方法,可以根据不同的参数进行设置,上述以比较简单的方法为例说明。
需要注意的是encrypt()
需要在数据库关闭时调用,例如在打开数据库之前调用。
如果需要解密数据库,则可以调用如下的方法:decrypt(Context ctxt, File originalFile, char[] passphrase)
对数据库文件进行解密,以使得当前的数据库文件能够被普通的SQlite打开,和encrypt
有些类似。
方法:SafeHelperFactory.rekey(SupportSQLiteDatabase db, char[] passphrase)
方法可以对现有的加密数据库进行加密更改。
需要注意的是,此方法不能够加密未加密的数据库,加密数据库请调用方法
encrypt()
。
使用 new SafeHelperFactory("".toCharArray())
创建SafeHelperFactory
。
混淆文件添加如下代码:
-keep class net.sqlcipher.** { ; }
-keep class net.sqlcipher.database. { *; }
CWAC-SafeRoom
是一个用来方便Room
数据库加密的框架,该项目底层同样是采用SQLCipher
原理实现,只是更加适用于Room
数据库框架,采用此加密会增大apk包数M,对于包大小敏感的应用慎重选择。