QtCipherSqlitePlugin插件使用 (2)

写在前面

注意: 各版本的不同,关注兼容性;

  • 本文演示版本: 1.3
  • 正考虑为其增加 cmake 脚本, 默认使用 qmake 编译源码;
  • 本文演示Qt版本: 5.14
  • 本文演示操作系统: windows11

本文目标

  • 介绍插件QtCipherSqlitePlugin的使用续集。

概述

  • sqlite默认不支持文件加密, 商业版支持加密。
  • QtCipherSqlitePlugin 是一个开源加密sqlite数据库的项目, 可以在 QtCipherSqlitePlugin githubQtCipherSqlitePlugin 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"); 代码时,数据库文件会再加密一次,进而,文件内容将无法正确读取。

posted @ 2023-03-03 07:30  mohist  阅读(387)  评论(0编辑  收藏  举报