【Android】数据安全(一) —— Sqlite加密

SQLCipher

SQLCipherSQLite 数据库的的开源扩展,使用了 256 位 AES 加密,支持跨平台、零配置、数据100%加密、加密开销低至 5 -15%、占用空间小、性能出色等优点,因此非常适合保护嵌入式应用程序数据库,并且非常适合移动开发。

关于 SQLCipher 的使用,官网提供了 SQLiteDatabase 的接入案例,鉴于官网已有 SQLiteDatabase 案例,这里则不再重复赘述,本文改为在 Room 中集成。

打开 app 目录下的 build.gradle 文件,添加插件和依赖

// 用到 kapt 必须添加该插件
apply plugin: 'kotlin-kapt'

dependencies {
	// room
    kapt("androidx.room:room-compiler:2.4.2")
    implementation "androidx.room:room-ktx:2.4.2"
    implementation("androidx.room:room-rxjava3:2.4.2")
    // sqlcipher 数据库数据加密
    implementation 'net.zetetic:sqlcipher-android:4.5.6@aar'
    implementation 'androidx.sqlite:sqlite:2.2.0'
}

新建一个继承 RoomDatabase() 的类,设置 SQLiteOpenHelper

@Database(entities = [Classes::class, Students::class], version = 2, exportSchema = false)
abstract class SchoolDatabase : RoomDatabase() {
    companion object {
        var db: SchoolDatabase ?= null
        // 单例模式的双重检查锁
        fun getDataBase(context: Context) : SchoolDatabase{
            if (db == null) {
                synchronized(SchoolDatabase::class.java){
                    if (db == null){
                        // 使用 SQLCipher 加密
                        val factory = SupportOpenHelperFactory("database password".toByteArray())
                        db = Room.databaseBuilder(context.applicationContext, SchoolDatabase::class.java, "your database name")
                            .openHelperFactory(factory)
                            .build()
                    }
                }
            }
            return db as SchoolDatabase;
        }
    }
}

编写完成数据库的增删改查相关代码后,运行项目并完成对数据写入操作。

使用 Android StudioDevice Explorer 功能,打开 data/data/your package name/database/ 文件夹,就可以看到应用的数据库。

在这里插入图片描述

鼠标右键点击 your package name 下创建的数据库,选择 Save AS ... 保存到桌面,使用 SQLiteStudio 数据库工具打开,就会有这样的提示:无法添加数据库 C:/Users/XXX/Desktop/your database file:file is not a database

因为我们已经对数据库进行了加密,是不能直接对其进行访问的。需要更换数据类型为 SQLCipher ,并输入在代码中设置的数据库密码,点击 ok 后,就可以对数据库进行访问了。

在这里插入图片描述
如果未使用 SQLCipher 对数据库进行加密,数据库是可以直接访问的。

SQLCipher 除了能支持 SQLiteRoom 之外,还支持 GreeDAO 数据库。不支持 ObjectDB

下载 Demo

参考文档

SQLCipher 官网
在 Android 中集成 SQLCipher

SQLiteCrypt

SQLiteCryptSQLite 数据库添加了透明的 AES 256 加密支持。SQLiteCrypt 非常快,它只是使 SQLite 速度减慢几个百分点,因此您的用户甚至不会注意到它的存在。

SQLiteCrypt 也是一个可以免费使用的 SQLite 加密库,在它的官网下方,提供了 LinuxUbuntuWindow.NetAndroid 等版本的 demo,SQLiteCrypt 并没有像 SQLCipher 那样提供了一个与 Room 库兼容的版本。Room 库是基于 AndroidSQLite API构建的,而 SQLiteCrypt 是一个 SQLite 的 C 扩展,它需要使用其自带的 API 来打开和操作加密的数据库。

使用 SQLiteCrypt 需要引入 .so 库,以及 .aar 文件。

在这里插入图片描述

dependencies {
	implementation(name:'android-database-sqlitecrypt-release', ext:'aar')
}

使用时,用的是 com.sqlitecrypt.database.SQLiteDatabase 进行创建数据库

public void initDb() {
	File dbFile = this.getDatabasePath("test.db");
	String dbPath = dbFile.getPath();
	if(!dbFile.exists()) {
	    new File(dbFile.getParent()).mkdirs();
	}
	// 第二个参数为数据库的密码,可不填(即不设置加密),使用 SQLiteDatabase.changePassword(password) 加密
	SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, "", null);
	// 设置数据库的访问密码为 abc123
	db.changePassword("abc123");
	// 查询数据库里 student 的表
	db.rawQuery("SELECT * FROM student", null);
	// 插入一条数据
	db.execSQL("insert into student(id,name) VALUES(1, 'Sparta');");
	// 删除 student 表中 id = 1 的数据
	db.delete("student", "id=1", null);
	// 关闭数据库
	db.close();
}

com.sqlitecrypt.database.SQLiteDatabaseandroid.database.sqlite.SQLiteDatabase 的用法基本一致,它们都有 execSQLrawQuery 的方法,只要有点数据库基础知识就可以写出可执行的 SQL 语句。

其它

上面提到的数据库加密框架都是可以免费使用,当然,他们也有付费版本。

我在写这篇博客之前,去了解了一些数据库加密的技术,有的博主提到一种方式:写入数据库前进行数据加密,取出来时解密。

这种方式看着是可行的,但 不可取

数据加密一般都是将一段字符转译为其它字符,例如:byte、String、二进制。众所周知的 MD5,知道吧?它是把字符转换成了16、32位长度的字符。不考虑解密,假设一个表有10个字段,这时候需要插入一条数据,那么就有 9 ~ 10 个字段需要调用 MD5 加密算法加密一次,这才只是10个字段,如果一个表有几十个字段呢?

如果这样搞,相较于上述两个加密方式来说,这种方式时间复杂度、空间复杂度都处于最差劲那一组,不仅如此,还增加了维护成本。

参考文档

SQLiteCrypt 官网

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Qt中使用SQLite数据库进行数据加密,可以通过设置密码来保护数据库的安全性。Qt提供了QSqlDatabase类用于进行数据库管理,可以通过设置加密标志进行数据库加密。 首先,需要在Qt中导入相应的模块和头文件: ``` #include <QtSql> #include <QSqlDatabase> ``` 然后,创建一个QSqlDatabase对象,并设置连接的数据库类型为SQLite: ``` QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); ``` 接下来,可以指定要连接的SQLite数据库文件,并设置加密参数: ``` db.setDatabaseName("路径/数据库文件名.db"); db.setPassword("加密密码"); ``` 然后,打开数据库连接: ``` if (db.open()) { //数据库已成功打开 } else { //数据库打开失败 } ``` 现在,可以执行相应的操作,如进行数据查询、插入、更新等操作,与普通的SQLite操作相似。 需要注意的是,加密后的数据库文件与普通的数据库文件不兼容,如果需要对已有的数据库进行加密,可以先将原数据库的数据导出为SQL脚本,然后使用加密的数据库文件重新创建数据库,并将导出的数据导入到新的数据库中。 除了设置加密密码,还可以通过其他的安全措施来保护数据库的安全性,如限制对数据库文件的访问权限、定期备份数据库、设置强密码等。 总之,通过在Qt中使用SQLite数据库,并设置加密密码,可以有效地保护数据库的数据安全性。 ### 回答2: Qt是一种跨平台的C++开发框架,支持多种数据库操作,其中包括SQLiteSQLite是一个轻量级的嵌入式数据库,常用于移动应用程序和小型桌面应用程序。 要加密SQLite数据库,可以使用一些加密算法和技术来保护数据库中的数据。有几种方法可以实现SQLite数据库的加密。 一种常用的方法是使用SQLCipher库。SQLCipher是一个基于SQLite的扩展,它提供了在数据库级别对SQLite数据库进行加密的功能。使用SQLCipher,可以对数据库进行加密,并使用密码进行访问控制。这样,只有知道密码的人才能访问和解密数据库中的数据。 另一种方法是使用Qt的QCryptographicHash类和QSqlDatabase类来手动加密数据库。可以使用QCryptographicHash类生成哈希值,然后将其与数据库中的数据进行混合和加密。使用QSqlDatabase类,可以连接到SQLite数据库并执行加密的查询和操作。 无论使用哪种方法,都需要在使用数据库之前进行初始化和设置。在加密过程中,务必选择一个强密码,并且妥善保存密码以供解密数据库时使用。 加密SQLite数据库可以提高数据的安全性,防止未经授权的访问和获取敏感信息。无论是使用SQLCipher库还是手动加密,都需要仔细考虑数据库的安全需求和使用场景,以选择最合适的加密方法并保护数据的完整性和可访问性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宾有为

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值