美文网首页
CWAC-SafeRoom数据库加密

CWAC-SafeRoom数据库加密

作者: 静水红阳 | 来源:发表于2021-02-01 20:51 被阅读0次

概述

对于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地址
开发者文档

相关文章

  • CWAC-SafeRoom数据库加密

    概述 对于Room数据库,SQLCipher加密并不能够直接支持,因此CWAC-SafeRoom便应运而生。CWA...

  • Java面试

    一、数据库 1、常见的数据库查询修改和数据库加密问题 (1)数据库的密码加密:单向加密,insertinto...

  • SQLCipher加解密的操作

    1. 创建加密数据库 2. 打开加密数据库 3. 修改数据库密码 4. 加密已有的数据库 5. 解密数据库 参考资...

  • SQLit加密解密

    sqlit数据库 当前数据库的加密解密 一般是两种方式 加密数据库存储的内容。 加密数据库本身。sqlit 本身是...

  • 【转·链接】iOS FMDB对数据库进行加密

    iOS - 使用FMDB进行数据库加密iOS FMDB数据库加密相关

  • 怎么可以确保数据库安全呢?

    怎么可以确保数据库安全呢? 一、数据库数据加密 数据加密能够有用防止数据库信息失密性的有用手段。一般加密的办法有更...

  • Shiro-安全框架

    不加数据库 加上数据库 加密 代码

  • Android从非加密数据库迁移到加密数据库

    title: Android从非加密数据库迁移到加密数据库date: 2019-12-26 13:26:53cat...

  • greenDAO数据库之加密

    传送门-->索引一、greenDAO数据库加密介绍greenDAO3.0以上的版本中有加密数据库接口:DaoMas...

  • nodejs 关于密码加密

    加密分为 直接加密、加盐加密 加盐加密更安全,建议加盐 登录时为输入密码再次同盐值加密比对数据库内的加密密码即可判...

网友评论

      本文标题:CWAC-SafeRoom数据库加密

      本文链接:https://www.haomeiwen.com/subject/hamstltx.html