QT使用WxSQLite3打开加密数据库并查询 - 实践

QT使用WxSQLite3打开加密数据库并查询

这篇文章主要目的是让大家快速实现打开加密sqlite数据库的功能,并没有对其中所用的库进行详细说明,还请见谅

一、SQLite3MultipleCiphers

该库集成了多种wxsqlite的加密算法,可以通过在代码中随意切换不同的加密算法。
github地址:https://github.com/utelle/SQLite3MultipleCiphers?tab=readme-ov-file

编译

我使用的是release 2.1.2版本的源码。
直接在vscode中打开使用cmake构建,选择和你QT项目对应的编译工具,CMakeLists基本不用修改,直接编译就行了。,
编译完成后得到:

libsqlite3mc.dll
libsqlite3mc.dll.a

头文件我是从sqlite3mc-2.1.2-sqlite-3.50.0-win32.zip中获取的
https://github.com/utelle/SQLite3MultipleCiphers/releases/download/v2.1.2/sqlite3mc-2.1.2-sqlite-3.50.0-win32.zip

二、QT中实现

引用libsqlite3mc

在.pro文件中添加如下,我把libsqlite3mc.dll.a放在项目目录的libs文件夹中

LIBS += -L$$PWD/libs -llibsqlite3mc.dll

头文件引用:

#放在项目目录的utils/wxsqlite文件夹中
INCLUDEPATH += $$PWD/utils/wxsqlite

不要忘了libsqlite3mc.dll要放在编译出来的测试程序目录下哦

功能代码-打开数据库测试

部分代码由AI生成

// 加密算法类型
QList<QString>
  CODEC_TYPE_NAME_LIST = {
  "AEGIS"
  , "Ascon-128"
  , "SQLCipher"
  , "System.Data.SQLite: RC4"
  , "ChaCha20"
  , "wxSQLite3: AES 128 Bit"
  , "wxSQLite3: AES 256 Bit"
  }
  ;
  QList<QString>
    CODEC_TYPE_LIST = {
    "aegis"
    , "ascon128"
    , "sqlcipher"
    , "rc4"
    , "chacha20"
    , "aes128"
    , "aes256"
    }
    ;
    sqlite3* db;
    // db_path是数据库文件路径
    if (SQLITE_OK != sqlite3_open(db_path.toStdString(
    ).c_str(
    )
    , &db)
    ) {
    ui->label_test_status->
    setText(tr("数据库打开失败"
    )
    )
    ;
    return
    ;
    }
    // 设置密码
    bool result = true
    ;
    // cipher是加密算法类型
    std::string cipher = CODEC_TYPE_LIST[ui->comboBox_codec_type->
    currentIndex(
    )].toStdString(
    ).c_str(
    )
    ;
    std::string pragma = "PRAGMA cipher = '" + cipher + "';"
    ;
    result &= SQLITE_OK == sqlite3_exec(db, pragma.c_str(
    )
    , nullptr, nullptr, nullptr)
    ;
    pragma = "PRAGMA key = '" + password.toStdString(
    ) + "';"
    ;
    result &= SQLITE_OK == sqlite3_exec(db, pragma.c_str(
    )
    , nullptr, nullptr, nullptr)
    ;
    if (!result) {
    ui->label_test_status->
    setText(tr("设置密码失败"
    )
    )
    ;
    return
    ;
    }
    char* errMsg = nullptr;
    // 执行查询
    const char* sql = "SELECT name FROM sqlite_master WHERE type='table';"
    ;
    if (sqlite3_exec(db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK
    ) {
    ui->label_test_status->
    setText(errMsg)
    ;
    sqlite3_free(errMsg)
    ;
    }
    else {
    ui->label_test_status->
    setText(tr("测试成功"
    )
    )
    ;
    }
    // 关闭数据库
    sqlite3_close(db)
    ;

简便地写一个QT界面:在这里插入图片描述

测试Demo

通过只要成功打开了数据库后续的管理就是传统的sqlite代码了,这有一个轻松的demo,大家有应该的可以下载试试看,有障碍能够评论交流一下。
https://gitee.com/gjhjsan/qt-wxsqlite3-demo
在这里插入图片描述

posted @ 2025-07-18 20:42  yfceshi  阅读(1)  评论(0)    收藏  举报