深入解析:sqlite3的加解密全过程

news/2025/9/19 21:54:17/文章来源:https://www.cnblogs.com/wzzkaifa/p/19101765

目的

最近想用加密的sqlite3数据库,因为想把素材和数据结构都加密,让别人看不到一点信息,做到绝对的保密:
在这里插入图片描述
一个麻烦事了,怎么办?就是然后查sqlite3加密的资源,发现原生的Qt只支持sqlite3数据库,但其加密并未实现,这可
分析了网上的各种信息,最终选择:插件模式。
为什么选择这种方式,这是最轻松的,并且满足了要求,就这么简单。
而原生的方式,其实就是单独编译sqlite3的代码,但该程序并未提供加密能力,因此又需要借助openssl达成加密功能,故而又得编译openssl库,编码openssl库,还得需要perl的支持,于是特别的麻烦,直接放弃掉这个原生的方法,直接用插件,这个技巧最好了。
通过能被加密的,只有我们用正确的密码才能连接上我们的数据库。加密之后就能够对数据安全作出一定的保障。就是我们希望我们的数据库
关于选择,一张图说明:
在这里插入图片描述

情况分析

wxSQLite3的介绍

wxSQLite3 是一个围绕 SQLite 3.x 数据库的 C++ 包装器,专门用于基于 wxWidgets 库的程序。
wxSQLite3 不会尝试隐藏底层数据库,相反,几乎支持当前 SQLite3 版本的所有特殊功能,例如创建用户定义的标量或聚合函数。
由于 SQLite 以 UTF-8 编码存储字符串,因此 wxSQLite3 方法给出了 wxStrings 和 UTF-8 字符串之间的自动转换。这最适合 wxWidgets 的 Unicode 构建。在 ANSI 构建中,当前的语言环境转换对象(wxConvCurrent)用于转换为 UTF-8 或从 UTF-8 转换。
要是使用外部管理工具修改数据库内容,则必须特殊小心,缘于并非所有这些工具都以 Unicode 或 UTF-8 模式运行。
否使用 128 位或 256 位 AES 加密的决定必须在编译时进行。就是从版本 1.7.0 开始,wxSQLite3 包含一个使用 AES 加密的基于密钥的 SQLite3 加密扩展。
从版本 4.0.0 开始,加密扩展允许在运行时选择密码方案。目前拥护以下加密方案:
AES 128 Bit CBC - No HMAC (wxSQLite3)
AES 256 Bit CBC - No HMAC (wxSQLite3)
ChaCha20 - Poly1305 HMAC (sqleet)
AES 256 Bit CBC - SHA1/SHA256/SHA512 HMAC (SQLCipher)

为什么选择插件的方式

sqlite官方带加密版本的是要收费的,这个时候就不得不推荐一个项目
QtCipherSqlitePlugin
一个QT的加密Sqlite数据库的插件,编译特别容易,直接使用QtCreator打开编译即可。就是该项目
这是一个基于SQLite源代码和wxWidget中的wxSQLite3的cipher SQLite的Qt插件。
Qt是一个完整的开发框架,其应用旨在简化桌面、嵌入式和移动平台应用程序和用户界面的创建。您能够在https://www.qt.io上找到更多详细信息。
SQLite是一个软件库,它达成了一个自涵盖、无服务器、零配置、支撑事务的SQL数据库引擎。SQLite是全球部署最广泛的SQL数据库引擎。SQLite的源代码属于公有领域。您可以在http://www.sqlite.org/网站上找到更多详细信息。
wxSQLite3是围绕公共领域SQLite 3.x数据库的C++封装,专为基于wxWidgets库的程序设计。wxSQLite3包含一个SQLite的可选扩展,支持使用128位AES加密进行基于密钥的数据库文件加密。更多详细信息请访问http://utelle.github.io/wxsqlite3。wxSQLite3遵循wxWindows库许可协议发布。
通过你能够在这里找到如何编译这个插件。
你允许在这里找到如何采用这个插件。
此处表明更改内容。

生成QtCipherSqlite插件

源码:
https://github.com/devbean/QtCipherSqlitePlugin
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
放到Qt安装路径的plugins下面:
在这里插入图片描述

运行实例

#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>#include <QSqlDatabase>#include <QSqlQuery>#include <QDebug>#include <QSqlError>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);// 1. 初始化加密数据库QSqlDatabase db = QSqlDatabase::addDatabase("SQLITECIPHER");db.setDatabaseName("secure.db");db.setPassword("123456");db.setConnectOptions("QSQLITE_CREATE_CIPHER=sqlcipher;QSQLITE_USE_CIPHER=sqlcipher;QSQLITE_CIPHER=sqlcipher;SQLCIPHER_LEGACY=4");if (!db.open()) {qDebug() <<"数据库打开失败:" << db.lastError();return -1;}// 2. 创建加密表QSqlQuery query(db);if (!query.exec("CREATE TABLE IF NOT EXISTS users (""id INTEGER PRIMARY KEY AUTOINCREMENT,""username TEXT UNIQUE NOT NULL,""password TEXT NOT NULL)")) {qDebug() <<"建表失败:" << query.lastError();}// 3. 删除数据if (!query.exec("DELETE FROM users WHERE username='admin' or username = 'test'")) {qDebug() <<"删除失败:" << query.lastError();}// 4. 插入数据query.prepare("INSERT INTO users (username, password) VALUES (?, ?)");query.addBindValue("admin");query.addBindValue("123456");if (!query.exec()) {qDebug() <<"插入失败:" << query.lastError();}query.prepare("INSERT INTO users (username, password) VALUES (?, ?)");query.addBindValue("test");query.addBindValue("123456");if (!query.exec()) {qDebug() <<"插入失败:" << query.lastError();}// 5. 更新数据query.prepare("UPDATE users SET password=? WHERE username=?");query.addBindValue("654321");query.addBindValue("admin");if (!query.exec()) {qDebug() <<"更新失败:" << query.lastError();}// 6. 查询数据if (query.exec("SELECT * FROM users")) {while (query.next()) {qDebug() <<"ID:" << query.value(0).toString()<<"用户名:" << query.value(1).toString()<<"密码:" << query.value(2).toString();}}db.close();return a.exec();}

运行情况:
在这里插入图片描述

与SQLiteStudio的连接情况:

不加密码,显示连接不上:
在这里插入图片描述
加密方式才成功:
在这里插入图片描述

wxSQLite3 - SQLite的轻量级封装库

围绕公共领域SQLite 3.x数据库的C++封装,专为基于wxWidgets库的程序设计。就是wxSQLite3
wxSQLite3并不试图隐藏底层数据库,相反,它几乎协助当前SQLite3版本的全部特性,例如创建用户定义的标量函数或聚合函数。
由于SQLite以UTF-8编码存储字符串,因此wxSQLite3技巧提供了wxStrings与UTF-8字符串之间的自动转换。这在wxWidgets的Unicode构建中效果最佳。在ANSI构建中,使用当前区域设置转换对象(wxConvCurrent)进行UTF-8的转换。如果使用外部管理工具来修改数据库内容,则必须特别小心,因为并非所有这些工具都以Unicode或UTF-8模式运行。
自1.7.0版本起,wxSQLite3包含了一个基于密钥的SQLite3加密扩展,该扩展使用AES加密。是否启用128位或256位AES加密的决定必须在编译时做出。从4.0.0版本开始,加密扩展允许在运行时选择密码方案。
目前支持以下加密方案:
AES 128位CBC - 无HMAC(wxSQLite3)
AES 256位CBC - 无HMAC(wxSQLite3)
这个加密算法)就是ChaCha20 - Poly1305 HMAC(sqleet)(默认)(经验证默认的确
AES 256位CBC - SHA1/SHA256/SHA512 HMAC(SQLCipher版本1至4)
RC4 - 无HMAC(System.Data.SQLite)
Ascon 128 - Ascon标签(Ascon)(自4.9.8版本起)
AEGIS - AEGIS标签(AEGIS)(自4.10.0版本起)

总结

目的就是为了把整个数据库加密,关键选择哪一个库,选择了插件的库,插件利用非常的方便,知道用了QtCipherQqlitePlugin库,但这一个库是一个什么情况,必须大致了解,这一个插件库就是这样的情况:
在这里插入图片描述

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

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

相关文章

U522155 板垣 カノエ is WATCHING YOU std

U522155 板垣 カノエ is WATCHING YOU #include<bits/stdc++.h> #define int long long #define add(a,b) to[++ tot] = b,nxt[tot] = h[a],h[a] = tot #define con putchar_unlocked( ) #define ent putchar_u…

ctfshow web

ctfshow里面免费的web题不写白不写ctf.show_红包题第二弹1打开题目显示这样 看看源码有无提示可以看到提示了cmd参数,那我们就随便传点东西看看会有什么回显又是代码审计,可以看到大小写字母过滤后只有小写p可以使用…

代码随想录算法训练营第三天 | leetcode 203 707 206

203移除链表元素 注意事项:java语言的访问链表和数据用的是".",空指针是小写的null。在删除链表时先对表头进行判断避免表头是null和表头元素是要删除的元素,下面进行循环寻找时要注意判断指针的下一个指针…

Codeforces Round 1051 (Div. 2) A~D2

A. All Lengths Subtraction 思维。 每次选择长度为 \(k(k \in [1,n])\) 的区间减 \(1\),那么第一个首选的就是 \(a_i = n\) 的 位置,然后维护 \(n\) 所在的区间,检查 \(n-k+1\) 是否在其两边,有的话就扩大区间,否…

【F#学习】数组:Array

Array 在F#中, 一个数组(Array)包含0个或多个元素,长度固定,但内容可以改变。元素需要具有相同的类型。 // 声明一个数组。注意看清操作符是 [| 和 |] let empty = [| |] let emptyAlternative = Array.emptylet …

CTFWEB姿势总结

CTFWEB姿势总结 RCE 尝试是否有命令执行漏洞 示例 payload 思路(Linux 为例):简单命令report; whoami report|whoami report$(whoami)如果 URL 执行后页面输出了你的用户名(例如 www-data),说明命令执行存在。 W…

详细介绍:架构思维:分布式缓存实战

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

规模化加速AI:从用户、开发者到企业的深度策略解析

本文深入探讨了加速AI系统的三大维度:终端用户追求的实时响应体验、开发者面临的数据与硬件瓶颈解决方案,以及企业关注的投产效率与合规性。文章详细分析了边缘推理、模型压缩、多云GPU调度等关键技术策略,并引用行…

ctfshow 菜狗杯

没想到在菜狗杯写到了qq列表里的佬出的题ctfshow 小舔田? <?php include "flag.php"; highlight_file(__FILE__);class Moon{public $name="月亮";public function __toString(){return $thi…

详细介绍:测试用例详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

国际服务器(VPS):泰国、印尼、菲律宾、马来西亚、香港、台湾、新加坡、日本、美国、英国等。

VPS 国际服务器(VPS):泰国、印尼、菲律宾、马来西亚、香港、台湾、新加坡、日本、美国、英国等。 mleo.siteVPS推荐 泰国、印尼、韩国、菲律宾、马来西亚、亚太等 Lightnode:1C2G-$7.71/Month 美国(Month) CloudCo…

缓存常见问题

缓存常见问题 缓存穿透 概念: 查询缓存中没有,数据库也没有的数据,大量的请求都穿透了缓存层直达数据库,导致数据库因压力过大而宕机。 本质是一种人为攻击手段。 解决方案:数据库不存在数据时,存放一个临时数据到缓存…

ctfshow 电子取证

这里的电子取证应该说算入门难度,不是很难,感兴趣的新手可以了解一下JiaJia-CP-1 先把题目文件下载下来看到是raw后缀,常见的内存镜像的后缀,使用volatility打开(这边真心建议使用kali中的volatility打开,windows…

插入排序与希尔排序 - 实践

插入排序与希尔排序 - 实践2025-09-19 21:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; …

最新IDEA 2025 专业版破解永久破解教程(附资源)intellij IDEA

一、intellij idea软件下载 [软件名称]:intellij idea 克网盘下载链接:https://pan.quark.cn/s/2af0fb5ec2e5 迅雷文件分享:Intellij IDEA 2025链接:https://pan.xunlei.com/s/VO_X5mj3eocLmO5BuL5ztWKhA1?pwd=uw…

AtCoder ABC423F - Loud Cicada 题解 容斥原理

题目大意: 问 \([1, Y]\) 范围内有多少个数是:\(A_1, A_2, \ldots, A_N\) 中恰好 \(K\) 个数的倍数。 解题思路: 容斥原理。 思路完全来自 StelaYuri大佬的博客。 示例程序: #include <bits/stdc++.h> using…

1756:八皇后

题目 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇…

矩阵置零-leetcode

题目描述 给定一个 *m* x *n* 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1:输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:输…

重新开始配置hadoop等

重新开始配置hadoop等1

IIS 部署 asp.net core 实用的方案时,出现500.19、500.31问题的解决方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …