QtCipherSqlitePlugin插件使用 (2)
写在前面
注意: 各版本的不同,关注兼容性;
- 本文演示版本: 1.3 ;
- 正考虑为其增加 cmake 脚本, 默认使用 qmake 编译源码;
- 本文演示Qt版本: 5.14
- 本文演示操作系统: windows11
本文目标
- 介绍插件QtCipherSqlitePlugin的使用续集。
概述
- sqlite默认不支持文件加密, 商业版支持加密。
- QtCipherSqlitePlugin 是一个开源加密sqlite数据库的项目, 可以在 QtCipherSqlitePlugin github 和 QtCipherSqlitePlugin gitee获取源码。
- 基于某些原因,本文不提供源码, 有需要,请联系文末 二维码 或 私信。
以下使用,假定已下载好官方源码
源码下载:
git clone https://github.com/devbean/QtCipherSqlitePlugin.git
使用续集
可开发一款加解密工具
- QtCipherSqlitePlugin 插件提供了对sqlite数据库的加密、更新密钥和解除密钥的功能。 根据不同的加密算法和密码,可开发一款针对sqlite数据库文件的加解密工具。
加密后文件的读写
- sqlite数据库文件加密后, 当程序打开或者关闭时无需调用 加密、更新密钥 和 解除密钥的功能, 打开和关闭方式同普通sqlite数据库文件。
- 上面说的可能比较抽象, 一个例子说明,假设sqlite数据库文件A已经调用了加密(密码假设为 123ABC)功能, 完成了文件加密,现在,应用程序需要读写该数据库文件A:
...
// 1. 这里的参数得指定为 SQLITECIPHER
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
// 2. 设置sqlite数据库文件名称,
dbconn.setDatabaseName("A.db");
// 3. 如果数据库存在密码,请设置,并放在 dbconn.open调用之前。
dbconn.setPassword("123ABC");
// 5. 打开数据库
if (!dbconn.open())
{
qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
exit(CONNECTION_FAILED);
}
...
// 读写数据库的操作和之前一致, 没有变化。
....
dbconn.close();
而不是 应用程序每次打开时,都调用一次加密或者删除密钥的功能后, 比如下面的代码( 错误示范 )
...
// 1. 这里的参数得指定为 SQLITECIPHER
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
// 2. 设置sqlite数据库文件名称,
dbconn.setDatabaseName("test.db");
// 3. 如果数据库存在密码,请设置,并放在 dbconn.open调用之前。
dbconn.setPassword("password");
// 4. 调用接口,完成加密. 比上面多了 这行代码
db.setConnectionOptions(""QSQLITE_USE_CIPHER=sqlcipher; QSQLITE_CREATE_KEY");
// 5. 打开数据库
if (!dbconn.open())
{
qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
exit(CONNECTION_FAILED);
}
...
// 读写数据库的操作和之前一致, 没有变化。
dbconn.close();
因为文件已经加密过了,我们的目标时读写加密后的文件, 当执行db.setConnectionOptions(""QSQLITE_USE_CIPHER=sqlcipher; QSQLITE_CREATE_KEY"); 代码时,数据库文件会再加密一次,进而,文件内容将无法正确读取。