Qt SQLite3数据库加密 QtCipherSqlitePlugin

在客户端软件开发过程中,基本都会涉及到数据库的开发。QT支持的数据库也有好几种(QSQLITE, QODBC, QODBC3, QPSQL, QPSQL7),SQLite就是其中之一,但这个 SQLite 是官方提供的开源版本,没有加密功能的。如果对于数据保密性有要求的,那么就要考虑对数据库或者数据本身进行加密了。最好的选择或许是对数据库本身进行加密(既不会暴露表结构,也不会暴露数据细节),那么如何对sqlite3数据库进行加密?本文将逐一进行剖析。

一、下载插件

https://github.com/devbean/QtCipherSqlitePlugin
https://gitee.com/mirrors/QtCipherSqlitePlugin

二、QtCipherSqlitePlugin的编译

QtCipherSqlitePlugin工程包含三个项目:demo、sqlitecipher、test_plugin。其中sqlitecipher是插件,另外两个都是示例程序。使用qtcreator打开QtCipherSqlitePlugin.pro文件,再选择项目的编译器,在debug模式下编译。编译完成后的dll文件位于:sqlitecipher\plugins\sqldrivers\sqlitecipher.dll

三、QtCipherSqlitePlugin的使用

  • 找到sqlitecipher/plugins/sqldrivers/sqlitecipher.dll文件,将其拷贝到qt目录下 C:\Qt\5.14.2\mingw73_64\plugins\sqldrivers。
  • 检查插件是否成功加载
    qDebug() << QSqlDatabase::drivers();
  • 如果输出的内容包含SQLITECIPHER,则表示已被成功加载。例如我输出的是:“QSQLITE”, “QODBC”, “QODBC3”, “QPSQL”, “QPSQL7”, “SQLITECIPHER”
  • 支持的加密方式:aes128cbc、aes256cbc、chacha20、sqlcipher、rc4

四、示例代码

int main(int argc, char *argv[])
{
   
    QCoreApplication app(argc, argv);
    Q_UNUSED(app)

    qDebug() << QSqlDatabase::drivers();
    Q_ASSERT(QSqlDatabase::isDriverAvailable("QSQLITE")); // from Qt
    Q_ASSERT(QSqlDatabase::isDriverAvailable("SQLITECIPHER")); // from our plugin

    //
    QSqlDatabase conn = QSqlDatabase::addDatabase("SQLITECIPHER");
    conn.setDatabaseName("test.db");
#if 0//将原本没有加密的数据库文件进行加密(只需要执行一次)
    conn.setPassword("test");
    QString options = "QSQLITE_USE_CIPHER=sqlcipher; SQLCIPHER_LEGACY=1; SQLCIPHER_LEGACY_PAGE_SIZE=4096; QSQLITE_CREATE_KEY";
    conn.setConnectOptions(options);
    bool ok = conn.open();
    qDebug() << "open: " << ok << "\nisOpenError:" << conn.isOpenError() << "\nlastError:" << conn.lastError();
#endif

#if 0//删除数据库密码(QSQLITE_REMOVE_KEY or QSQLITE_UPDATE_KEY=)
    conn.setPassword("test");
    QString options = "QSQLITE_USE_CIPHER=sqlcipher; SQLCIPHER_LEGACY=1; SQLCIPHER_LEGACY_PAGE_SIZE=4096; QSQLITE_REMOVE_KEY";
    conn.setConnectOptions(options);
    bool ok = conn.open();
    qDebug() << "open: " << ok << "\nisOpenError:" << conn.isOpenError() << "\nlastError:" << conn.lastError();
#endif

#if 1//修改数据库密码
    conn.setPassword("test");
    QString options = "QSQLITE_USE_CIPHER=sqlcipher; SQLCIPHER_LEGACY=1; SQLCIPHER_LEGACY_PAGE_SIZE=4096; QSQLITE_UPDATE_KEY=qqqq";
    conn.setConnectOptions(options);
    bool ok = conn.open();
    qDebug() << "open: " << ok << "\nisOpenError:" << conn.isOpenError() << "\nlastError:" << conn.lastError();
#endif
    conn.close();

    return 0;
}

五、查看加密后的数据库

如何使用外部工具查看加密后的数据库,这里介绍一款软件 QSliteStudio
在这里插入图片描述

相关推荐

  1. QSQLITE QODBC QODBC3 QPSQL QPSQL7这些分别是什么?

    2024-01-30 12:38:01       32 阅读
  2. MySQL 数据加密

    2024-01-30 12:38:01       57 阅读
  3. Mybatis 实现数据加密

    2024-01-30 12:38:01       28 阅读
  4. 前端数据加密方式

    2024-01-30 12:38:01       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-30 12:38:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-30 12:38:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-30 12:38:01       82 阅读
  4. Python语言-面向对象

    2024-01-30 12:38:01       91 阅读

热门阅读

  1. Redis -- 背景知识

    2024-01-30 12:38:01       62 阅读
  2. 【C++】构造函数

    2024-01-30 12:38:01       55 阅读
  3. 如何系统地自学 Python?

    2024-01-30 12:38:01       74 阅读
  4. 【Vue3】状态管理工具——pinia的使用

    2024-01-30 12:38:01       71 阅读
  5. 四:C语言-条件分支语句

    2024-01-30 12:38:01       59 阅读
  6. 【前端】防抖和节流

    2024-01-30 12:38:01       65 阅读
  7. nginx项目部署+项目优化

    2024-01-30 12:38:01       58 阅读
  8. L1-032 Left-pad

    2024-01-30 12:38:01       64 阅读
  9. 美易官方《盘前:道指期货跌0.04% 风险周降临》

    2024-01-30 12:38:01       63 阅读