sqlite数据库加密

对数据库加密的思路有两种:

  1. 将内容加密后再写入数据库:这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。

  2. 对数据库文件加密:将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。

QtCipherSqlitePlugin 插件加密sqlite数据库

QtCipherSqlitePlugin-GITHUB地址

devbean编译QtCipherSqlitePlugin 插件

下载的文件中包含QtCipherSqlitePlugin 编译的源文件以及测试程序文件

sqlitecipher:插件编译库文件的源代码文件夹
test:测试程序文件夹

在这里插入图片描述

编译

  • 进入到下载的文件夹内,使用Qt Creator对源文件进行构建(注意不用运行,因为直接生成了库文件)
  • 编译完成生成了sqlitecipher.dll和sqlitecipherd.dll文件,分别对应debug以及release版本下的库;
  • 将动态库文件拷贝到Qt的插件目录 plugins/sqldrivers 即可
    在这里插入图片描述

使用

检查 QtCipherSqlitePlugin 是否成功加载

我们使用下面的代码检查 QtCipherSqlitePlugin 是否成功加载:

qDebug() << QSqlDatabase::drivers();

如果输出中有 SQLITECIPHER 的名字,说明插件是正常的。
在这里插入图片描述

数据库增加密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_CREATE_KEY");
if (!dbconn.open()) {
    qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
    exit(CONNECTION_FAILED);
}

我们使用 test.db 数据库,将密码设置为 test,同时指定连接选项为QSQLITE_CREATE_KEY。此时,调用open()函数之后,QtCipherSqlitePlugin 将使用改密码为这个数据库进行加密。

数据库删除密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_REMOVE_KEY");
if (!dbconn.open()) {
    qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
    exit(CONNECTION_FAILED);
}
数据库更新密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_UPDATE_KEY=newtest");
if (!dbconn.open()) {
    qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
    exit(CONNECTION_FAILED);
}

如果原密码不正确,QtCipherSqlitePlugin 会直接返回错误。

如果新密码设置为空,例如QSQLITE_UPDATE_KEY=,则作用等同于删除密码。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐