CWAC-SafeRoom – Room加密结构

前语

在这一期工作开发中涉及到敏感数据加密,现在数据存储用的MMKVRoomMMKV自带加密,Room数据库怎样加密呢?之前没有数据加密相关的工作经验,对加密的了解只停留在书本上的对称加密、非对称加密上。所以首先想的是有没有加密东西类以及密钥怎么获取,并且数据那么多,怎么对数据进行一致的加密呢?带着这个疑问咨询了导师,导师让我预研下CWAC-SafeRoom结构。

1、CWAC-SafeRoom结构概述

GitHub上对其描述是:CWAC-SafeRoom实现了 Room 可用于处理特定版本的 SQLite 的一系列类和接口。详细来说,这个项目的类将Room与SQLCipher for Android连接起来,SQLCipher for Android是SQLite的一个版本,供给其内容的通明加密。

2、引进办法

官方供给了两种引进办法,一种是适用于AndroidX,另一种适用于老版的Android 支撑库,这里我运用了第一种引进办法。

AndroidX

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

Android 支撑库

repositories {
    maven {
        url "https://s3.amazonaws.com/repo.commonsware.com"
    }
}
dependencies {
    implementation "com.commonsware.cwac:saferoom:1.2.1"
}

3、用法

Room.databaseBuilder(
    context,
    AppDatabase::class.java, "database-market"
)
    .build()

咱们在实例化Room数据库中需求传入几个参数

  • context – Java里的上下文
  • class – Room的dataBase类
  • name – 数据库保存之后的文件名称

填完参数,咱们再写build()来回来dataBase类的实体

运用 SafeRoom

  • 创立加密实例将暗码传递给SafeHelperFactory类
  • 将加密实例添加在Room数据库实例化中
// 创立一个加密实例
val factory = SafeHelperFactory(AppConfig.DB_PASSWORD.toCharArray())
return Room.databaseBuilder(
    context,
    AppDatabase::class.java, "database-market"
)
    .openHelperFactory(factory)
    .build()

4、获取数据库状况

SQLCipherUtils类中内置State枚举类(检测到的数据库状况,根据咱们是否能够在没有暗码的情况下翻开它),包含了数据库的三种状况,分别是

  • DOES_NOT_EXIST — 不存在
  • UNENCRYPTED — 未加密
  • ENCRYPTED — 已加密

getDatabaseState()办法经过传入context、数据库名称,回来该数据库的状况。其原理是来经过咱们是否能够在没有暗码的情况下翻开它来确定此数据库是否显示为加密。

/**
 * 获取数据库状况
 */
private fun checkDbState(): SQLCipherUtils.State {
    return SQLCipherUtils.getDatabaseState(context, "database-market")
}

5、兼容处理

兼容处理是经过对数据库状况的判断,对未加密的数据库进行数据加密的一个操作。

/**
 * 兼容处理
 */
private fun compatibleDb() {
    when (checkDbState()) {
        SQLCipherUtils.State.ENCRYPTED -> {
            // 已加密 do nothing
        }
        SQLCipherUtils.State.UNENCRYPTED -> {
            SQLCipherUtils.encrypt(
                context,
                "database-market",
                AppConfig.DB_PASSWORD.toCharArray()
            )
        }
        SQLCipherUtils.State.DOES_NOT_EXIST -> {
            SpeedyLog.e(MdmConstant.BaseTAG, "数据库不存在")
        }
    }
}

6、更改加密密钥

能够经过SafeHelperFactory类中的rekey()办法更改与此数据库关联的暗码。需求传入数据库char[]类型的暗码。需求留意的是加密更改不适用于未加密的数据库,所以在更改密钥前需求对未加密的数据库进行处理。

/**
 * 更改加密密钥
 * 加密更改不适用于未加密的数据库
 * @param dataBase
 * @param pass
 */
fun reKey(dataBase: SupportSQLiteDatabase, pass: CharArray) {
    launchScope.launch {
        //将未加密的数据库进行处理
        compatibleDb()
        SafeHelperFactory.rekey(dataBase, pass)
    }
}

7、实现作用

Android StudioApp InspectionDatabase Inspector 中检查

无加密结构作用

CWAC-SafeRoom - Room加密框架

有加密结构作用

CWAC-SafeRoom - Room加密框架

8、功能测试

CWAC-SafeRoom - Room加密框架

对两个数据库刺进数据耗费的时间进行计算,得出CWAC-SafeRoom结构对功能的影响仍是比较大的。

9、小结

在开发过程中,学习到了Room的加密结构,CWAC-SafeRoom结构学习运用起来仍是较为容易的。本文只列举了其间较为常用的办法,想要了解更多的话,能够检查GitHub上的项目,网址放在下方了。文章若呈现错误,欢迎各位批评指正,写文不易,转载请注明出处谢谢。

GitHub项目网址:

详情能够参考README-original.markdown文档中的结构概述和详细运用操作 CWAC-SafeRoom加密结构