首页 > 解决方案 > 无法使用 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 数据库。提前致谢。

标签: c++qtsqliteencryptionsqlcipher

解决方案


自 2018 年 4 月起,wxSQLite3 支持在运行时选择各种密码方案,其中包括 SQLCipher 方案。但是,必须在 wxSQLite3 中选择 SQLCipher legacy模式才能访问使用原始 SQLCipher 库加密的数据库文件。也就是说,除了 QtCipherSqlitePlugin 的连接选项 QSQLITE_USE_CIPHER=sqlcipher 之外,还必须使用附加连接选项 SQLCIPHER_LEGACY=1。


推荐阅读