背景: - 最近发现软件在运行过程中,数据库文件暴露在外面,而且直接拷贝后就能打开,发现这样来说数据并不是很安全
复制代码- 我使用的开发环境是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编译后,就可以使用了。
希望可以帮到你!🌹🌹🌹🌹🌹🌹
|