Qt之SQLite数据库加密
·
文章目录
sqlite数据库加密
对数据库加密的思路有两种:
-
将内容加密后再写入数据库:这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
-
对数据库文件加密:将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。
QtCipherSqlitePlugin 插件加密sqlite数据库
devbean编译QtCipherSqlitePlugin 插件
下载的文件中包含QtCipherSqlitePlugin 编译的源文件以及测试程序文件
sqlitecipher:插件编译库文件的源代码文件夹
test:测试程序文件夹

编译
- 进入到下载的文件夹内,使用Qt Creator对源文件进行构建(注意不用运行,因为直接生成了库文件)
- 编译完成生成了sqlitecipher.dll和sqlitecipherd.dll文件,分别对应debug以及release版本下的库;
- 将动态库文件拷贝到Qt的插件目录 plugins/sqldrivers 即可

使用
检查 QtCipherSqlitePlugin 是否成功加载
我们使用下面的代码检查 QtCipherSqlitePlugin 是否成功加载:
qDebug() << QSqlDatabase::drivers();
如果输出中有 SQLITECIPHER 的名字,说明插件是正常的。
数据库增加密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_CREATE_KEY");
if (!dbconn.open()) {
qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
exit(CONNECTION_FAILED);
}
我们使用 test.db 数据库,将密码设置为 test,同时指定连接选项为QSQLITE_CREATE_KEY。此时,调用open()函数之后,QtCipherSqlitePlugin 将使用改密码为这个数据库进行加密。
数据库删除密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_REMOVE_KEY");
if (!dbconn.open()) {
qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
exit(CONNECTION_FAILED);
}
数据库更新密码
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("test.db");
dbconn.setPassword("test");
dbconn.setConnectOptions("QSQLITE_UPDATE_KEY=newtest");
if (!dbconn.open()) {
qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
exit(CONNECTION_FAILED);
}
如果原密码不正确,QtCipherSqlitePlugin 会直接返回错误。
如果新密码设置为空,例如QSQLITE_UPDATE_KEY=,则作用等同于删除密码。
更多推荐

所有评论(0)