Невозможно открыть зашифрованную вручную базу данных SQLite с помощью QtCipherSqlitePlugin и наоборот - PullRequest
0 голосов
/ 07 сентября 2018

Я вручную создал базу данных 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;
}

То же самое происходит для обратного процесса: если я зашифрую базу данных с помощью этого плагина, то я не могу вручную открыть базу данных с помощью браузера БДили другие подобные программы, потому что он не принимает пароль.

Как я могу решить эту проблему?Мне нужно получить доступ к зашифрованной базе данных SQLite через мое программное обеспечение и стороннее приложение, такое как браузер БД.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

С апреля 2018 года wxSQLite3 поддерживает выбор различных схем шифрования во время выполнения, в том числе схему SQLCipher. Однако необходимо выбрать режим SQLCipher legacy в wxSQLite3, чтобы иметь возможность доступа к файлам базы данных, которые были зашифрованы с помощью исходной библиотеки SQLCipher. То есть, в дополнение к опции соединения QSQLITE_USE_CIPHER = sqlcipher в QtCipherSqlitePlugin необходимо использовать дополнительную опцию соединения SQLCIPHER_LEGACY = 1.

0 голосов
/ 07 сентября 2018

Согласно сайту QtCipherSqlitePlugin, алгоритм шифрования взят из wxSQLite3 в wxWidget, который, вероятно, отличается от SQLCipher, поэтому вы испытываете несовместимость. Если бы это был я, я бы отказался от QtCipherSqlitePlugin и вместо этого просто использовал бы интерфейс SQLite3 C. Возможно, вам придется собрать библиотеку SQLite3 самостоятельно с помощью встроенного SQLCipher.

...