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

QtCipherSqlitePlugin 是一个能够加密 SQLite 数据的 Qt 插件,经过之前几个版本的更新,现在已经有不少使用。

但是,由于之前的版本与 Qt 私有类紧密耦合,导致插件的代码会随着 Qt 的更新出现无法编译的情况。解决方案之一是添加对 Qt 版本的判断,但是终究无法解决后续 Qt 版本的升级所带来的阵痛。于是,这一次大刀阔斧的进行调整,将 Qt 的某些私有类直接添加到插件中,除去 Qt 私有类的依赖。针对以后 Qt 的更新,插件只会选择对性能有影响的部分进行跟进,至于 Qt 内部架构的调整,则不在插件代码更新范围内。

经过这一次的调整,编译插件变得非常简单:只需要使用 QtCreator 打开插件中 sqlitecipher 文件夹下的 sqlitecipher.pro 进行编译即可。编译后,需要将生成的 sqlitecipher.dll 复制到 Qt 的 plugins/sqldrivers 文件夹下。本次更新。豆子使用 Qt 5.5 和 Qt 5.7 进行了测试,如果有其它版本的 Qt 不能正常使用,请及时联系豆子。

当然,本次更新我们还是使用了 SQLITECIPHER 作为插件的名字。如果需要修改这个名字,Qt4 需要修改 smain.cpp 中的 DriverName 定义,Qt5 需要修改 SqliteCipherDriverPlugin.json 中的 SQLITECIPHER 一行。

出去上述调整,更为重要的是,本次更新增加了很多新功能,包括为原来没有密码的 SQLite 数据库添加密码,修改数据库密码以及删除密码。下面我们将着重介绍这些功能的使用。

检查 QtCipherSqlitePlugin 是否成功加载

我们可以使用下面的代码检查 QtCipherSqlitePlugin 是否成功加载:

qDebug() << QSqlDatabase::drivers();

如果输出中有 SQLITECIPHER 的名字,那么恭喜你,插件没有问题!

为没有加密的数据库增加密码

Qt 默认提供的 SQLite 插件是没有加密功能的。新版本的 QtCipherSqlitePlugin 支持为原本没有加密的数据库增加密码,使用方法如下:

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 将使用改密码为这个数据库进行加密。

删除数据库密码

QtCipherSqlitePlugin 可以删除数据库密码,此时需要提供原密码,并使用连接选项QSQLITE_REMOVE_KEY,如下:

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);
}

更新数据库密码

QtCipherSqlitePlugin 可以更新数据库原有密码,需要设置原密码,并且使用连接选项QSQLITE_UPDATE_KEY设置新密码,具体代码如下:

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=,则作用等同于删除密码。

如果需要,可以到 github 上面获取 git 库,checkout 代码的 0.5 标签即可。

Comments (36)

  1. 喻纹东 2016年5月27日
  2. 喻纹东 2016年5月27日
    • 豆子 2016年5月27日
      • 喻纹东 2016年5月27日
      • 喻纹东 2016年5月27日
        • 豆子 2016年6月3日
      • QT菜鸟 2016年6月9日
  3. 喻纹东 2016年5月27日
    • 豆子 2016年5月27日
  4. QT菜鸟 2016年6月8日
    • 豆子 2016年6月14日
      • vintx 2016年6月25日
        • 豆子 2016年6月25日
  5. 顾育豪 2016年7月26日
    • 豆子 2016年7月29日
  6. 青山 2016年8月23日
    • 青山 2016年8月23日
  7. 大鹏 2016年8月26日
    • 豆子 2016年8月26日
  8. stlcours 2016年8月27日
    • 豆子 2016年8月27日
  9. ZCShou 2016年10月25日
  10. xh 2017年2月21日
    • 豆子 2017年2月21日
  11. 2017年3月9日
    • 2017年3月9日
      • 2017年3月9日
  12. 零口酥 2018年3月19日
    • 零口酥 2018年3月19日
  13. zhai kang 2018年6月12日
    • 豆子 2018年6月14日
  14. yoer 2018年7月13日
  15. yoer 2018年7月14日
  16. hjz 2018年8月9日
  17. yi 2018年9月4日
    • 豆子 2018年9月8日

Leave a Reply