c++ - 无法使用 QtCipherSqlitePlugin 打开手动加密的 SQLite 数据库,反之亦然
问题描述
我手动创建了一个 SQLite 数据库(名为“localDB.db”),并使用DB browser用密码保护它。如果我没记错的话,DB 浏览器使用 SQLCipher(默认页面大小为 1024)来加密数据库。但是,如果我尝试使用 QT 插件QtCipherSqlitePlugin(参见下面的代码)打开数据库,我总是收到“密码无效或密码不匹配”的错误,尽管我显然提供了正确的密码并设置了密码作为“sqlcipher”。
#include <QCoreApplication>
#include <QDebug>
#include <QDir>
#include <QSqlError>
#include <QtSql/QSqlDatabase>
#ifdef Q_OS_IOS
#include <QtPlugin>
Q_IMPORT_PLUGIN(SqliteCipherDriverPlugin)
#endif
#define CONNECTION_FAILED -1
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << QSqlDatabase::drivers();
QString dir = QCoreApplication::applicationDirPath();
QString db_file_path = dir + "/Data/localDB.db";
qDebug() << "DB file path is:" << db_file_path;
QSqlDatabase db = QSqlDatabase::addDatabase("SQLITECIPHER");
db.setDatabaseName(db_file_path);
db.setPassword("test");
db.setConnectOptions("QSQLITE_USE_CIPHER=sqlcipher");
db.open();
if (!db.isOpen())
{
qDebug() << "Connection failed: " << db.lastError().driverText();
exit(CONNECTION_FAILED);
}
return 0;
}
逆过程也是如此:如果我使用此插件加密数据库,则无法使用 DB Browser 或其他类似程序手动打开数据库,因为它不接受密码。
我怎么解决这个问题?我需要通过我的软件和第三方应用程序(如 DB 浏览器)访问加密的 SQLite 数据库。提前致谢。
解决方案
自 2018 年 4 月起,wxSQLite3 支持在运行时选择各种密码方案,其中包括 SQLCipher 方案。但是,必须在 wxSQLite3 中选择 SQLCipher legacy模式才能访问使用原始 SQLCipher 库加密的数据库文件。也就是说,除了 QtCipherSqlitePlugin 的连接选项 QSQLITE_USE_CIPHER=sqlcipher 之外,还必须使用附加连接选项 SQLCIPHER_LEGACY=1。
推荐阅读
- three.js - 通过路径在 Laravel 中渲染 STL
- gatsby - gatsby-image-plugin,StaticImage 不能覆盖默认的包装样式(gatsby-image-wrapper & gatsby-image-wrapper-constrained style)
- javascript - 为什么 setMatrix([...matrix, [[x][y]]]) 不起作用?
- node.js - MongoDB - 带有 NodeJS 的 Mongoose 查找并加入集合
- python - 使用 numpy 将时间平均值恢复为即时值
- angular - 为什么服务作为一个实例跨模块共享?
- pine-script - TradingView 中的趋势线(Pine 脚本)
- ssl - TLS/SSL 证书已过期,需要在 POSTFIX SMTP 邮件服务器上更新它们
- azure - 检索 Microsoft Azure 应用服务存储的配额
- image-processing - 如何计算/确定给定形状的圆的百分比/部分(很可能是部分圆)