我已经手动创建了一个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数据库。 预先感谢。
答案 0 :(得分:0)
根据QtCipherSqlitePlugin站点,密码算法来自wxWidget中的wxSQLite3,这可能与SQLCipher不同,因此会遇到不兼容的情况。如果是我,我放弃QtCipherSqlitePlugin,而只使用SQLite3 C接口。您可能必须使用内置的SQLCipher自己构建SQLite3库。