QtSqlite加密--QtCipherSqlitePlugin的使用

news2025/1/20 3:55:42

文章目录

  • QtSqlite加密
    • 第一步:环境准备
    • 第二步:连接数据库
    • 第三步:数据库操作
    • 第四步:使用新的可视化工具查看数据库数据

QtSqlite加密

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

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

  • QtCipherSqlitePlugin

该项目是一个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查看数据库的时候已经无法查看了,因此我们需要使用新的软件去查看数据库。

推荐软件:

  • SQLiteStudio

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

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/414640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

期刊论文图片代码复现【由图片还原代码】(OriginMatlab)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

【数据结构】图解八大排序(上)

文章目录一、排序简介二、直接插入排序三、希尔排序四、直接选择排序五、堆排序六、冒泡排序七、冒泡排序与直接插入排序效率对比一、排序简介 生活中&#xff0c;我们经常能看到排序的应用。例如&#xff0c;我们在网购商品的时候&#xff0c;经常按销量从高到低排序。 那么这…

Linux服务器怎么分区

Linux服务器怎么分区 我是艾西&#xff0c;linux系统除了从业某个行业经常要用到的程序员比较熟悉&#xff0c;对于小白或只会用Windows系统的小伙伴还是会比较难上手的。今天艾西简单的跟大家聊聊linux系统怎么分区&#xff0c;让身为小白的你也能一眼看懂直接上手操作感受程序…

【数据结构】用Java实现七大排序算法

目录 &#x1f337;1. 排序的概念及引用 1.1 排序的概念 1.2 衡量指标 1.2 十个排序算法 1.3 十个排序性能对比 &#x1f337;2. 冒泡排序 2.1 算法描述 2.2 动图 ⭐️代码优化 &#x1f337;3. 选择排序 3.1 算法描述 3.2 动图 3.3 代码 &#x1f337;4. 插入排序 4.1 算法描述…

(大数据开发随笔9)Hadoop 3.3.x分布式环境部署——全分布式模式

索引完全分布式模式守护进程布局集群搭建准备总纲配置文件格式化集群启动集群集群控制命令集群启停进程查看启动日志查看集群常见问题案例演示&#xff1a;WordCount完全分布式模式 分布式文件系统中&#xff0c;HDFS相关的守护进程也分布在不同的机器上&#xff0c;如&#x…

cgroups是linux内核中限制、记录、隔离进程组(process groups)所使用的物理资源的机制

容器虚拟化 可以实现应用程序的隔离 直接使用物理机的操作系统可以快速响应用户请求 不占用部署时间 占用少量磁盘空间 缺点∶学习成本增加、操作控制麻烦、网络控制与主机虚拟化有所区别、服务治理难。 微服务架构师需要会多门编程语言&#xff0c;才能治理各种服务 三种…

web路径专题+会话技术

目录自定义快捷键1. 工程路径问题及解决方案1.1 相对路径1.2 相对路径缺点1.3 base标签1.4 作业11.5 作业21.6注意细节1.7 重定向作业1.8 web工程路径优化2. Cookie技术2.1 Cookie简单示意图2.2 Cookie常用方法2.2 Cookie创建2.3 Cookie读取2.3.1 JSESSIONID2.3.2 读取指定Cook…

Linux文件目录操作命令

目录 Linux常用的基础命令 使用技巧 1. ls命令&#xff1a;查看当前目录所有内容 ls 命令的多种使用方法&#xff1a; 注&#xff1a;假如执行乱码&#xff0c;则执行以下两步的代码&#xff1a; 2. cd命令&#xff1a;切换当前工作目录&#xff0c;即进入指定目录 3. …

网络-IP地址(嵌入式学习)

IP地址基本概念IPv4 五类&#xff1a;A B C D E特殊地址子网掩码子网号概念IPv6优势举个栗子基本概念 IP地址是Internet中主机的标识 IP地址&#xff08;Internet Protocol Address 互联网国际地址&#xff09;是一种在Internet上的给主机编址的方式&#xff0c;它主要是为互…

Java Web 开发技术的演进:从 Servlet、Spring MVC 到 WebFlux 及其竞品分析

前言 随着互联网技术的快速发展&#xff0c;Web 应用程序在处理海量用户访问和大数据时面临着巨大的挑战。在这个过程中&#xff0c;Java Web 开发技术经历了从 Servlet 到 Spring MVC 再到 WebFlux 的演变。在这篇文章中&#xff0c;我们将探讨这三个技术的发展历程、痛点及解…

Go的IO -- Go语言设计与实现

Go合IO的不解之缘 协程是Go的很大的一个优势。Go天然支持高并发&#xff0c;那么我们来研究一下这个高并发的秘诀在哪里&#xff1f; 执行体调度得当。CPU 不停的在不同的执行体&#xff08; Goroutine &#xff09;之间反复横跳&#xff01;CPU 一直在装填和运行不同执行体的…

数字化坚鹏:金融数据治理、数据安全政策解读及银行数字化转型

金融数据治理、数据安全政策解读及银行数字化转型课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不知道如何准确理解金融数据治理及数据安全相关政策 不清楚金融数据治理及数据安全相关政策对银行有什么影响&#xff1f; 不清楚如何进行银行数字化转型&#xff1f…

Azure DevOps Pipelines

Azure DevOps主要通过管理代码、管理服务器、管理发布的管道来实现一体化解决方案 发布流程&#xff1a; 1、代码上传Repos仓储 略 2、DevOps连接并管理发布服务器 2.1、Deployment Groups配置 2.2、服务器执行连接指令 2.3、服务器状态查看 3、创建 Pipline(构建代码) 3.1…

前端中font的使用

知识点&#xff1a; 运行截图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name&…

【RabbitMQ】SpringBoot整合RabbitMQ、实现RabbitMQ五大工作模式(万字长文)

目录 一、准备 1、创建SpringBoot项目 2、添加配置信息 3、创建配置类 二、RabbitMQ的配置类里创建队列 三、RabbitMQ的配置类里创建交换机及绑定队列 四、SpringBoot整合RabbitMQ入门案例 1、生产者 2、消费者 四、SpringBoot里实现RabbitMQ五大工作模式 1、简单模式…

Linux--进程多线程(上)

前言 精神内耗一方面可能是消极的&#xff0c;人好像一直在跟自己过不去&#xff0c;但其实它也是一种积极的情绪。精神内耗在某种程度上&#xff0c;是在寻找一种出口&#xff0c;寻找他自己人生的出口&#xff0c;寻找我今天的出口&#xff0c;或者寻找我一觉醒来明天的出口。…

【k8s完整实战教程5】网络服务配置(nodeport/loadbalancer/ingress)

系列文章&#xff1a;这个系列已完结&#xff0c;如对您有帮助&#xff0c;求点赞收藏评论。 读者寄语&#xff1a;再小的帆&#xff0c;也能远航&#xff01; 【k8s完整实战教程0】前言【k8s完整实战教程1】源码管理-Coding【k8s完整实战教程2】腾讯云搭建k8s托管集群【k8s完…

恐怖的ChatGPT!

大家好&#xff0c;我是飞哥&#xff01;不知道大家那边咋样。反正我最近感觉是快被ChatGPT包围了。打开手机也全是ChatGPT相关的信息&#xff0c;我的好几个老同学都在问我ChatGPT怎么用&#xff0c;部门内也在尝试用ChatGPT做一点新业务出来。那就干脆我就趁清明假期这一天宝…

AB测试基本原理

AB测试基本原理AB测试AB测试的基本步骤1、AB测试的基本步骤①选取指标指标的分类②建立假设③选取实验单位④计算样本量⑤流量分割⑥实验周期计算⑦线上验证⑧数据检验AB测试 所谓的AB测试就是使用实验组和对照组&#xff0c;通过控制变量法保证实验组和对照组基本条件一致&am…

NumPy 数组学习手册:6~7

原文&#xff1a;Learning NumPy Array 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 六、性能分析&#xff0c;调试和测试 分析&#xff0c;调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…