当前位置: 首页 > 工具软件 > CWAC > 使用案例 >

CWAC-SafeRoom数据库加密

向实
2023-12-01

概述

对于Room数据库,SQLCipher加密并不能够直接支持,因此CWAC-SafeRoom便应运而生。
CWAC-SafeRoom是一个用来方便Room数据库加密的框架,该项目底层同样是采用SQLCipher原理实现,只是更加适用于Room数据库框架。

使用

1. 包引入

使用此框架,首先需要引入对应的lib包。
由于androidx的变动,该内容有着两个版本的包引入,分别适用于androidx版本和旧版的Android support包版本,示例如下:

Androidx版本
repositories {
    maven {
        url "https://s3.amazonaws.com/repo.commonsware.com"
    }
}

dependencies {
    implementation "com.commonsware.cwac:saferoom.x:1.3.0"
}
旧版Android support版本
repositories {
    maven {
        url "https://s3.amazonaws.com/repo.commonsware.com"
    }
}

dependencies {
    implementation "com.commonsware.cwac:saferoom:1.2.1"
}

2. 使用

在使用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()获取的,还会清除控件中的内容。

3. 加密解密现有的数据库

如果之前项目内已经有采用Room创建的数据库,并且是没有在加密状态,直接采用上面的加密获取数据库实例去读取数据库文件是会出错的。出现的错误
因此如果需要采用加密,一般是需要去重新创建一个内容,然后进行数据迁移。
框架CWAC-SafeRoom提供了能够十分方便的对当前已有数据库的加密和解密过程。

1. 获取数据库加密状态

如果您已有使用Room或其他方式创建的SQLite数据库,则SQLCipherUtils该类具有getDatabaseState()encrypt()方法。
getDatabaseState(Context, String)方法用来获取数据库的加密状态,String为数据库名字。返回值包括:

  1. ENCRYPTED(已加密)
  2. UNENCRYPTED(未加密)
  3. DOES_NOT_EXITS(不存在)
2. 数据库加密

如果未加密,可以采用encrypt(Context, String, byte[])对数据库进行加密处理,其中String为数据库名字,byte[]为加密密码。

getDatabaseState和encrypt有多个重载方法,可以根据不同的参数进行设置,上述以比较简单的方法为例说明。

需要注意的是encrypt()需要在数据库关闭时调用,例如在打开数据库之前调用。

3. 数据库解密

如果需要解密数据库,则可以调用如下的方法:decrypt(Context ctxt, File originalFile, char[] passphrase)对数据库文件进行解密,以使得当前的数据库文件能够被普通的SQlite打开,和encrypt有些类似。

4. 更改加密秘钥

方法:SafeHelperFactory.rekey(SupportSQLiteDatabase db, char[] passphrase)方法可以对现有的加密数据库进行加密更改。

需要注意的是,此方法不能够加密未加密的数据库,加密数据库请调用方法encrypt()

5. 直接打开未加密的数据库

使用 new SafeHelperFactory("".toCharArray())创建SafeHelperFactory

3. 混淆规则

混淆文件添加如下代码:

-keep class net.sqlcipher.** { ; }
-keep class net.sqlcipher.database. { *; }

总结

CWAC-SafeRoom是一个用来方便Room数据库加密的框架,该项目底层同样是采用SQLCipher原理实现,只是更加适用于Room数据库框架,采用此加密会增大apk包数M,对于包大小敏感的应用慎重选择。

Git地址
开发者文档

 类似资料: