QtSqlite加密--QtCipherSqlitePlugin的使用

QtSqlite加密

上次说了QxOrm的数据库连接、映射和基础的增删改查,但是我们在使用数据库的时候并不希望别人看到我们数据库的内容,我们希望我们的数据库是能被加密的,只有我们用正确的密码才能连接上我们的数据库。加密之后就可以对数据安全作出一定的保障。

sqlite官方带加密版本的是要收费的,这个时候就不得不推荐一个项目

该项目是一个QT的加密Sqlite数据库的插件,编译特别简单,直接使用QtCreator打开编译即可。所以不介绍编译了,直接介绍该插件的使用吧。

第一步:环境准备

虽然没有介绍编译,但是我们编译出来的库是需要拷贝到Qt安装目录下的

将sqlitecipher.dll 和 sqlitecipherd.dll 拷贝到安装目录下的$path$\5.15.2\msvc2019_64\plugins\sqldrivers文件夹下,之后我们就可以正常使用该方式创建sqlite数据库了。

第二步:连接数据库

我们之前直接使用的时候是直接使用QSQLITE去连接的,这里我们使用新的SQLITECIPHER类型,在此之前你可以先使用 QSqlDatabase::drivers() 查看是否支持,如果不支持,请重新进行环境准备步骤

我这里输出的是 QSQLITE QODBC QODBC3 QPSQL QPSQL7 SQLITECIPHER

void databaseInit()
{
    for(const auto &a : QSqlDatabase::drivers())
    {
        std::cout << a.toStdString() << " ";
    }
    std::cout << std::endl;
    
    qx::QxSqlDatabase::getSingleton()->setDriverName("SQLITECIPHER");
    qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
    qx::QxSqlDatabase::getSingleton()->setPassword("1234");
}

这里应该直接看函数名称就可以看懂,不需要进行详细的解释。

第三步:数据库操作

像之前一样直接进行数据操作,这里不做详细介绍。增删改查就可以。

我贴出代码,你们自己测试即可

#include <QApplication>
#include <QApplication>
#include "precompiled.h"
#include "person.h"
#include "author.h"
#include "author2.h"
#include "turbo_log.h"

void databaseInit()
{
    for(const auto &a : QSqlDatabase::drivers())
    {
        std::cout << a.toStdString() << " ";
    }
    std::cout << std::endl;
    qx::QxSqlDatabase::getSingleton()->setDriverName("SQLITECIPHER");
    qx::QxSqlDatabase::getSingleton()->setDatabaseName("./demo.db");
    qx::QxSqlDatabase::getSingleton()->setPassword("1234");
}

void createTable()
{
    QSqlError daoError = qx::dao::create_table<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table person:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author:" + daoError.text().toStdString());
    }
    daoError = qx::dao::create_table<author2>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("Table author2:" + daoError.text().toStdString());
    }
}

void insertData()
{
    person p;
    p.firstName = "王五";
    p.lastName = "王五2";
    p.birthDate = QDateTime::fromString("1996-04-25", "yyyy-MM-dd");
    p.age = 23;
    QSqlError daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    daoError =  qx::dao::insert(p);
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("insert update:" + daoError.text().toStdString());
    }
}

void selectData()
{
    QList<person> persons;
    qx::dao::fetch_all(persons);
    TurboLog::instance().getConsoleLogger()->error("select table:{}", persons.size());
}

void deleteData()
{
//    person p;
//    qx_query query;
//    query.where("id").isEqualTo(2);
    QSqlError daoError =  qx::dao::destroy_all<person>();
    if (daoError.type() != QSqlError::NoError)
    {
        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
    }
//    qx_query query2;
//    query2.where("id").isEqualTo(1);
//    daoError =  qx::dao::destroy_by_query<person>(query2);
//    if (daoError.type() != QSqlError::NoError)
//    {
//        TurboLog::instance().getConsoleLogger()->error("delete persons:" + daoError.text().toStdString());
//    }
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    databaseInit();
    insertData();
//    selectData();
    // deleteData();
    return app.exec();
}

第四步:使用新的可视化工具查看数据库数据

这里我们再使用DBeaver查看数据库的时候已经无法查看了,因此我们需要使用新的软件去查看数据库。

推荐软件:

该软件是开源的QT写的数据库查看工具,操作起来像Navicate(个人感觉),因此上手不难。我们就介绍如何连接到我们加密好的数据库吧。

在这里插入图片描述

如上图所示,我们先点击数据库 → \rightarrow 然后点击添加数据库 → \rightarrow 到数据类型我们选择WxSqlite3 → \rightarrow 选择数据库,输入密码 → \rightarrow 加密算法选择sqlsheet那个 → \rightarrow 点击测试连接(如果通过则显示一个对号) → \rightarrow 输入sql语句进行数据查询。

这是我工作了一天的成果,压缩包内包括Qt sqlite加密驱动所有的代码,以及一个调用例程,还有一个sqlite3shell.exe工具,用于加密数据库命令行下的分析。 使用这个加密驱动很简单,只需以下3步: 1. 将驱动的代码复制到你的app文件夹(共2个文件夹) 2. 在app的pro文件中加入 include(wxsqlite3/wxsqlite3.pri) include(zsqlitecipherdriver/zsqlitecipherdriver.pri) 3. 在需要的地方加入#include "zsqlitecipherdriver.h",这样就可以使用ZSQLiteCipherDriver类了,这个类是继承自QSqlDriver。所以可以传递给 QSqlDatabase::addDatabase。 详细的可以查看压缩包内源码。之后,main函数就可以这么使用sqlite加密驱动: ZSQLiteCipherDriver *driver = new ZSQLiteCipherDriver(); QSqlDatabase db = QSqlDatabase::addDatabase(driver); db.setDatabaseName("test.db"); db.setPassword("123"); db.open(); ... 加密驱动的稳定性没有问题,是我从Qt的开源代码中,找到Sqlite加密的驱动部分,然后修改的。修改的内容不多,最重要的是在数据库的open时,加入了sqlite3_key的调用,实现加密。 底层的加密实现,是来自wxsqlite3-3.0.6。这个我修改了一个宏定义,让其加密方式采用了AES256,而不是原来的AES128。 例程中包括了3个实用的函数,分别用来以某一密码打开或创建一个数据库,判断数据库是否处于解密状态,以及修改数据库密码。 sqlite3shell.exe跟官方提供的sqlite3.exe使用方法一样。只不过对于加密数据库,需要在对数据库进行任何操作前,先执行“PRAGMA key=xxx;”。通过这种方式输入数据库密码。检验之前的密码是否正确可以在命令行中键入“.databases”,如果没有错误提示,那就是解密成功了;如果密码错误,只能关闭sqlite3shell.exe,从头尝试了。 虽然这个资源,要的分数确实有点多,不过评价之后就能返还的。我相信这个资源值这个价值!下载后在Qt5上可以直接编译。不需要任何修改。Qt4上没试过,不承诺一定可用,但是应该没问题。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbolove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值