首页 Qt 带有加密功能的 SQLite Qt 插件(v0.2)

带有加密功能的 SQLite Qt 插件(v0.2)

37 3.8K

前面的文章中,曾经实现了一个带有加密功能的 SQLite Qt 插件。由于 Qt5 的发布,原来的代码已经不能通过编译,而且先前的实现因为只是演示性质,所以是将密码硬编码在代码中。现在,豆子更新了代码,使其能够运行于 Qt5。欢迎需要使用的童鞋下载~

本次更新,将代码结构做了调整,但是整体实现没有改变(详见前面的文章)。同时,将 sqlite 的版本升级为 3.7.15.1。

现在我们有两个子文件夹:sqlitecipher 和 test,前者是插件的全部代码,后者是一个简单的测试程序。

本次编译比之前要简单得多。编译之前,需要打开 sqlitecipher/qt_p.pri 文件,设置 Qt 的代码位置:

# Qt4
!greaterThan(QT_MAJOR_VERSION, 4): INCLUDEPATH += D:/Develop/Qt/4.8.4/src/sql/kernel

# Qt5
greaterThan(QT_MAJOR_VERSION, 4): INCLUDEPATH += D:/Develop/Qt/5.0.0/5.0.0/Src/qtbase/src/sql/kernel

第一行是 Qt4 的代码位置,第二行是 Qt5 的代码位置。这里的代码目录一般会到 sql/kernel 一层,目的是找到包含有 qsqlcachedresult_p.h 的文件夹。因此,只需要能够找到这个文件即可。

接下来,只需要打开 sqlitecipher 中的 sqlitecipher.pro 进行编译即可,无需单独编译 sqlite 库。编译过后,Qt4 需要将生成的 sqlitecipher.dll 和 sqlitecipher.lib,Qt5 需要将生成的 sqlitecipher.dll 复制到 Qt 的 plugins/sqldrivers 文件夹下。

正如前面所说,我们还是使用了 SQLITECIPHER 作为插件的名字。如果需要修改这个名字,Qt4 需要修改 smain.cpp 中的 DriverName 定义,Qt5 需要修改 SqliteCipherDriverPlugin.json 中的 SQLITECIPHER 一行。

本次更新除了支持 Qt5,还修改了open()函数,具体是在 qsql_sqlite.cpp 的 564 行。上一版本,我们将密码硬编码到文件中,现在我们则使用了open()函数的password参数。注意,由于此处的password应该使用

dbconn.setPassword("Trucc");

传递进来,详细示例代码可以参考 test/main.cpp。

按照老规矩,这里是全部打包文件。如果需要,则可以到 github 上面获取 git 库。

37 评论

vintx 2013年1月11日 - 13:26

非常感谢!我先前进行不同的尝试总算是编译通过了,不过跟楼主的比起来,还是差很远呀。

回复
豆子 2013年1月11日 - 13:29

过奖过奖,能够使用就好了啊

回复
精英王子 2013年1月12日 - 15:39

话说现在官方还没提供Qt5 mingw版吧?我在这里http://sourceforge.net/projects/mingwbuilds/files/external-binary-packages/Qt-Builds/ 下了一个非官方Qt5 MinGW版,但是用不了,运行其中的qtcreator直接崩溃,从官网下载Qt creator,添加工具链的时候提示Qt版本无效

回复
豆子 2013年1月13日 - 09:42

看说明文件,貌似要求必须使用他们自己编译的 mingw,你是用的他们的吗?

回复
精英王子 2013年1月13日 - 16:24

确实用了他们的MinGW(下载下来的压缩文件里面就有他们的MinGW)

关键是其中的qtcreator无法运行(直接是类似于段错误,没什么提示)...所以我下了官网的,估计官网的qtcreator不是用mingw编译的,所以后来的错误也是意料之中

对于目前在MinGW中使用Qt5, 你有什么建议么?自己编译?

回复
豆子 2013年1月14日 - 09:13

目前只能是自己编译,同时注意不要编译 webkit,按照官方的说法,现在版本的 webkit 还不能使用 mingw 编译,这也是 Qt5 没有提供 mingw 版本的原因之一。

回复
死机不死 2013年1月15日 - 19:50

😛 豆子你好,精英王子下载的是可以用的,我正在使用,解压到C:\SDK就可以运行了,C:\SDK\Qt5-x32\bin\qtcreator.exe这样的路径就可以了

死机不死 2013年1月15日 - 19:56

mingw如果没有安装VC2010的话就这个还是挺好,只有500多,不过要发布就不要了,链接库太大了,建议用vc2010编译,大概10M左右的库文件就可以了 😉

豆子 2013年1月16日 - 09:50

那你可以跟精英王子交流下啦

死机不死 2013年1月15日 - 19:53

业余时间学习QT,搞过MFC再搞QT,感觉还是挺容易的,从消息队列到现在的信号槽还是有些不适应,支持豆子,我打算用QT来实现我正在做的一个项目

回复
adai 2013年7月18日 - 18:18

测试不通过。。。。。
这个测试代码不具有测试能力,query.exec返回false

回复
豆子 2013年7月19日 - 15:53

我这里测试是正常的,会不会是其它问题?

回复
阿土 2013年7月22日 - 12:23

兄弟,你这个插件需要注册吗?为什么我运行test.exe说找不到SQLITECIPHER。

回复
豆子 2013年7月22日 - 17:38

不需要注册,但是需要把生成的插件复制到相应的 plugins 文件夹中,具体文中有介绍。

回复
阿土 2013年7月22日 - 19:03

就是放到里边了出现的上述现象。

回复
豆子 2013年7月23日 - 09:02

还要注意是不是插件和程序的编译版本不一致,比如插件是 debug 编译的,而程序却是 release 的。

回复
阿土 2013年7月22日 - 13:00

还有,为什么,我用那个test程序设置的数据库密码后,用其他密码一样可以连接,而且能够获得数据?也就是说,设不设密码都是一样的结果。

回复
阿土 2013年7月31日 - 12:07

恩,都弄好了,前几天测试了一下,加密解密都可以,但是发现这个加密解密使用的是自己的机制,也就是其他的APP(其他开发工具比如:VS,或者其他可以操作sqlite数据库的工具)用相同的密码打不开我们这个plugin设置密码的数据库,我们这个plugin也打不开用其他APP设置密码的数据库,也就是不通用,开发中的实际应用意义不大(只能用这个pulgin操作数据库)。不过这个用来理解Qt数据库的机制还是非常不错的,谢谢楼主分享。

回复
豆子 2013年7月31日 - 15:41

这个实在不是我们能解决的,sqlite 没有提供官方认可的加密算法,因此不存在一个通用的加密解密的东西。其它独立程序的加密解密通用存在这个问题。除非官方提供可选算法列表,否则这个没有办法解决。所以认为插件没有实际意义也不客观(这样来说,其它程序通用是没有实际意义的,因为除非“碰巧”选择了同一个算法,否则也是不能解密的)。

回复
阿土 2013年8月3日 - 14:20

其实这个我测试过,其他的sqlite的应用或工具基本上都可以互相打开加密码的数据,而只有我们采用的这个是独立不通用的,所以我考虑可能其他的应用或工具直接调用的是sqlite的dll内部自带的加密解密算法,所以可以打开,我再验证一下吧。

回复
豆子 2013年8月4日 - 17:13

sqlite 官方定义的加密算法是收费的,可能你所说的那些工具直接购买的官方算法。如果你找到的工具是开源的,可以尝试修改下这个加密算法的源代码,否则是有版权问题的。

回复
496393411@qq.com 2014年8月5日 - 16:06

豆子老师,以前一直在用你改的加密sqlite,最近需要放到qt的安卓端口,发现没办法加密,
能重新整理下加密的代码,可以移植到安卓上使用吗!

回复
豆子 2014年8月5日 - 21:20

安卓程序我不是很熟悉,可不可以帮忙做一个测试用例,将工程文件发送到邮箱?

回复
fc88 2014年9月16日 - 15:40

你好,我想请问一个问题,关于加密这里,是能够正常的使用,但是加密之后,我在其他的包括工具,甚至命令行都无法大哥这个数据库来查看到数据,因为开发时候还是需要检查一下数据之类的,所以就比较的麻烦,想请教一下,能怎么通过sqlite3.exe 之类的cmd 命令来查看这个加密后的数据库,或者进行导入导出的操作么?

回复
2015年6月23日 - 12:50

C:\Users\web\Desktop\QtCipherSqlitePlugin-master\sqlitecipher\qsql_sqlite.h:47: error: qsqlcachedresult_p.h: No such file or directory
#include "qsqlcachedresult_p.h"
^

回复
豆子 2015年6月29日 - 10:40

需要按照文中的要求,修改 qt_p.pri 中 INCLUDEPATH 的路径,因为插件需要使用私有头文件,这个没办法避免。

回复
Novisign 2015年9月23日 - 10:19

谢谢,完美解决问题。

回复
stlcours 2016年1月8日 - 00:38

请问修改以后的qt代码可以被静态编译吗?因为我不想带一个dll文件在外面。
另外,这样修改以后,自己的QT项目是不是就不能通用了?只能用这个自己修改后的QT代码进行编译?

回复
豆子 2016年1月9日 - 11:27

如果你只是将 Qt 做静态编译,你自己的源代码还是可以在别的 Qt 库上面使用的,只要没有修改 Qt 的源代码。

回复
月伴星辰 2016年2月20日 - 16:04

好东西,成功加密,但不找不到软件单独打开管理啊

回复
豆子 2016年2月22日 - 22:09

这个加密算法只能解密自己的,现在也没有工具管理

回复
FranklinFoong 2016年5月10日 - 18:02

请问博主,如果是现有数据库的话,我这里的情况是无法用setPassword的方法来进行加密,那这样的话应该用什么方法进行加密?

回复
ll 2016年5月11日 - 14:41

我运行的时候说找不到这个driver,我没有qt源码,但是编译没问题

回复
大鹏 2016年8月25日 - 21:36

豆子,你好,这边密码是固定Trucc吗?能通过什么方式修改吗?

回复
豆子 2016年8月26日 - 11:01 回复
森仔 2018年1月2日 - 11:10

请问一下楼主,我用Qt5.7.1 的时候出现 no matching function for call to 'QSqlCachedResult::QSqlCachedResult(const QSQLiteDriver*&) : QSqlCachedResult(db)的错误,是怎么回事呢

回复
姬强 2021年3月29日 - 17:20

您好!你这种加密完之后,用什么管理工具可以打开?

回复

回复 阿土 取消回复

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2