背景:
最近发现软件在运行过程中,数据库文件暴露在外面,而且直接拷贝后就能打开,发现这样来说数据并不是很安全
我使用的开发环境是VS QT,使用navicat创建了一个数据库
准备
百度搜索了一些资料和博客,发现QSqlite 本身是不支持这个加密功能的。然后说有这个叫 QtCipherSqlitePlugin
的一个QT扩展插件。
下载地址: 点击这里
开始编译库
1、然后使用VS for QT 工具打开这个pro文件:
2、编译一下这三个项目:
注意: 这个有个小问题,如果你的是vs2022,那么这个地方需要修改一下平台工具集:
编译完成以后找到对应的文件夹:
目录1:
目录2:
测试
1、新建一个vs工程
然后包含对应的头文件:
#include <qsqldatabase.h>
#include <qsqlquery.h>
#include <qsqlerror.h>
#include <qdebug.h>
测试是否数据库驱动是否存在:
qDebug() << "Available drivers:" << QSqlDatabase::drivers();
如果输出的结果包含这个新的数据库驱动,那么证明没问题
Available drivers: ("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7", "SQLITECIPHER")
最后一个就是我们新配置的数据库驱动
注意:
数据库创建密码只能创建,一次,如果创建多次就会报错!!!
所以,当我们第一次给数据库创建密码时:
第一步
这三行是设置数据库,这里我先在navicat中创建了一个不带密码的普通SQLite数据库,命名为test1.db
QString DB_FILE_PATH = "test1.db";
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");//添加SQLITECIPHER驱动
dbconn.setDatabaseName(DB_FILE_PATH);
第二步
这一行代表的是创建数据库的密码,请牢记,这个数据库这行代码只调用一次!调用一次! 用一次!一次!次!
下一次再打开数据库的时候,直接注释掉这一行。
dbconn.setConnectOptions("QSQLITE_CREATE_KEY;");
如果想更新密码则使用
dbconn.setConnectOptions("QSQLITE_UPDATE_KEY"); //更新密码
如果想删除密码则使用
dbconn.setConnectOptions("QSQLITE_REMOVE_KEY"); //删除密码
第三步
这一行代表设置加密的规则:
dbconn.setConnectOptions("QSQLITE_USE_CIPHER=aes128cbc;");
加密方式总共有五种:
- aes128cbc
- aes256cbc
- chacha20
- sqlcipher
- rc4
默认的情况下,好像使用的是第四种sqlcipher
PS:
但是,据说这种方法在navicat中打不开,所以,使用的是aes128cbc的加密方式。
还有的大佬说,需要这样来设置:
dbconn.setConnectOptions("QSQLITE_USE_CIPHER=sqlcipher;SQLCIPHER_LEGACY=1; SQLCIPHER_LEGACY_PAGE_SIZE=4096; QSQLITE_CREATE_KEY")
据说这样在代码中创建的数据库才能在navicat中打开,但是我没有测试这种方式,如果你们按照上一种设置解决不了,可以试试这样。
第四步
然后就是设置密码了:
dbconn.setPassword("123456");
第五步
打开navicat,新建一个连接:
简单设置一下:
然后测试一下连接:
报错了,别慌,这样来解决:
然后就会发现:
创建完成后,双击这个连接的时候,会提示要输入密码的哦,就是刚才程序里设置的123456.
👆这上面作为第一种方式:👆
第二种方式也就出来了:
我们可以使用navicat的时候直接创建一个带密码的sqlite数据库:
第一步:
第二步
看吧,同样也能够创建一个具有密码的sqlite数据库
这个会简单一些,但是,如果你程序中使用的时候,记得还是要加载我们编译的的那个数据库的驱动。
这个搞了我两天,终于算是弄出来了,前面使用QTCreator编译这个库的时候一直出问题,怎么放进去都不好用,所以,后来又找了一个新的,然后用VS编译后,就可以使用了。
希望可以帮到你!🌹🌹🌹🌹🌹🌹