无法使用QtCipherSqlitePlugin打开手动加密的SQLite数据库,反之亦然

时间:2018-09-07 11:23:16

标签: c++ qt sqlite encryption sqlcipher

我已经手动创建了一个SQLite数据库(名为“ localDB.db”),并使用DB browser用密码保护了它。如果我没记错的话,数据库浏览器使用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或其他类似程序手动打开数据库,因为它不接受密码。

如何解决此问题?我需要通过我的软件和第三方应用程序(如数据库浏览器)访问加密的SQLite数据库。 预先感谢。

1 个答案:

答案 0 :(得分:0)

根据QtCipherSqlitePlugin站点,密码算法来自wxWidget中的wxSQLite3,这可能与SQLCipher不同,因此会遇到不兼容的情况。如果是我,我放弃QtCipherSqlitePlugin,而只使用SQLite3 C接口。您可能必须使用内置的SQLCipher自己构建SQLite3库。