Я вручную создал базу данных SQLite (с именем localDB.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 или других подобных программ, поскольку он не принимает пароль.
Как я могу решить эту проблему? Мне нужно получить доступ к зашифрованной базе данных SQLite через мое программное обеспечение и стороннее приложение, такое как браузер БД.
Заранее спасибо.
Согласно сайту QtCipherSqlitePlugin, алгоритм шифрования взят из wxSQLite3 в wxWidget, который, вероятно, отличается от SQLCipher, поэтому вы испытываете несовместимость. Если бы это был я, я бы отказался от QtCipherSqlitePlugin и вместо этого просто использовал бы интерфейс SQLite3 C. Возможно, вам придется собрать библиотеку SQLite3 самостоятельно с помощью встроенного SQLCipher.
С апреля 2018 года wxSQLite3 поддерживает выбор различных схем шифрования во время выполнения, в том числе схему SQLCipher. Тем не менее, необходимо выбрать SQLCipher наследие режим в wxSQLite3, чтобы иметь возможность доступа к файлам базы данных, которые были зашифрованы с помощью исходной библиотеки SQLCipher. То есть, в дополнение к опции соединения QSQLITE_USE_CIPHER = sqlcipher в QtCipherSqlitePlugin необходимо использовать дополнительную опцию соединения SQLCIPHER_LEGACY = 1.