Qt SQLite加密插件QtCipherSqlitePlugin

 

以下为转载参考内容:

SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。

 

然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。

 

SQLite加密方式

对数据库加密的思路有两种:

 

1. 将内容加密后再写入数据库

这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。

 

不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。

 

2. 对数据库文件加密

将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。

 

 

QtCipherSqlitePlugin 最近升级到 1.0 版。这是一个比较大的升级,增加了一些新功能。感兴趣的童鞋可以升级试用下。

与之前的版本一样,QtCipherSqlitePlugin 还是基于 wxSQLite3 提供的 sqlite3secure 这个库。1.0 版的 QtCipherSqlitePlugin 插件将依赖的 wxSQLite3 升级到 4.0.4,sqlite 的版本是 3.24.0。

最新的 1.0 版代码可以使用 git 从 github 或者 gitee 获取:


 
 
  1. git clone https: //github.com/devbean/QtCipherSqlitePlugin.git
  2. // OR
  3. // git clone https://gitee.com/devbean/QtCipherSqlitePlugin.git
  4. cd QtCipherSqlitePlugin
  5. git checkout 1.0

全新的插件项目结构

前面几个版本的插件与 Qt 私有类紧密耦合,导致插件的代码会随着 Qt 的更新出现无法编译的情况。当初提到的解决方案是,将 Qt 的某些私有类的实现代码直接添加到插件代码树中,除去 Qt 私有类的依赖。这样,针对以后 Qt 的更新,插件只选择对性能有影响的部分进行跟进。这种实现固然能够减小插件代码的修改,但带来的问题是可能与未来的 Qt 版本不兼容,并且移植插件代码时可能会有一些问题。例如,虽然在外部使用时,插件的接口没有任何变化,但实际内部有了翻天覆地的变化。

为了解决这一问题,豆子重新调整了插件的项目结构。在 sqlitecipher 文件夹下的 sqlitecipher.pro 中增加了 Qt 私有文件的导入:


 
 
  1. QT_FOR_CONFIG += sqldrivers- private
  2. ...
  3. QT = core core- private sql- private

现在,我们的插件已经能够使用 Qt 私有类,而且编译插件也不需要做任何修改。目前豆子只使用 Qt 5.11 进行了测试,如果有其它版本的 Qt 不能正常使用,请及时联系豆子。

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

编译插件

插件的编译可以通过 Qt Creator 或者直接使用命令。

使用 Qt Creator  编译,将 clone 下来的代码切换到 tag 1.0,然后打开整个项目,编译完毕之后将编译之后得到的 sqlitecipher(d).dll 复制到 Qt 的插件目录 plugins/sqldrivers 即可。

或者可以依次使用下面的命令:

windows 下 如果用的是vs的编译器

1.打开vs的开发者cmd命令行

2.将make改为nmake


 
 
  1. git clone https://github.com/devbean/QtCipherSqlitePlugin.git
  2. # OR https://gitee.com/devbean/QtCipherSqlitePlugin.git
  3. cd QtCipherSqlitePlugin
  4. git checkout 1.0
  5. cd sqlitecipher
  6. mkdir -p build && cd build qmake ../sqlitecipher.pro
  7. make
  8. make install # 可能需要提升权限

检查 QtCipherSqlitePlugin 是否成功加载

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

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

如果输出中有 SQLITECIPHER 的名字,说明插件是正常的。

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

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


 
 
  1. QSqlDatabase dbconn = QSqlDatabase::addDatabase( "SQLITECIPHER");
  2. dbconn.setDatabaseName( "test.db");
  3. dbconn.setPassword( "test");
  4. dbconn.setConnectOptions( "QSQLITE_CREATE_KEY");
  5. if (!dbconn.open()) {
  6. qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
  7. exit(CONNECTION_FAILED);
  8. }

上面的代码,我们使用 test.db 数据库,将密码设置为 test,同时指定连接选项为QSQLITE_CREATE_KEY。此时,调用open()函数之后,QtCipherSqlitePlugin 将使用改密码为这个数据库进行加密。

删除数据库密码

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


 
 
  1. QSqlDatabase dbconn = QSqlDatabase::addDatabase( "SQLITECIPHER");
  2. dbconn.setDatabaseName( "test.db");
  3. dbconn.setPassword( "test");
  4. dbconn.setConnectOptions( "QSQLITE_REMOVE_KEY");
  5. if (!dbconn.open()) {
  6. qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
  7. exit(CONNECTION_FAILED);
  8. }

更新数据库密码

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


 
 
  1. QSqlDatabase dbconn = QSqlDatabase::addDatabase( "SQLITECIPHER");
  2. dbconn.setDatabaseName( "test.db");
  3. dbconn.setPassword( "test");
  4. dbconn.setConnectOptions( "QSQLITE_UPDATE_KEY=newtest");
  5. if (!dbconn.open()) {
  6. qDebug() << "Can not open connection: " << dbconn.lastError().driverText();
  7. exit(CONNECTION_FAILED);
  8. }

如果原密码不正确,QtCipherSqlitePlugin 会直接返回错误。

如果新密码设置为空,例如QSQLITE_UPDATE_KEY=,则作用等同于删除密码。

设置加密算法

QtCipherSqlitePlugin 支持四种加密算法:

  • AES 128 Bit CBC – No HMAC (wxSQLite3)
  • AES 256 Bit CBC – No HMAC (wxSQLite3)
  • ChaCha20 – Poly1305 HMAC (sqleet)
  • AES 256 Bit CBC – SHA1 HMAC (SQLCipher)

其中使用到的术语定义如下:

  • AES = Advanced Encryption Standard (Rijndael algorithm)
  • CBC = Cipher Block Chaining mode
  • HMAC = Hash Message Authentication Code
  • ChaCha20 = symmetric stream cipher developed by Daniel J. Bernstein
  • Poly1305 = cryptographic message authentication code (MAC) developed by Daniel J. Bernstein
  • SHA1 = Secure Hash Algorithm 1

默认加密算法在编译时设置。可以修改 sqlitecipher/sqlite3/sqlite3.pri 文件中的DEFINES += ...一行,找到CODEC_TYPE=CODEC_TYPE_CHACHA20一句,修改CODEC_TYPE的值即可。可选值为:

  • CODEC_TYPE_AES128
  • CODEC_TYPE_AES256
  • CODEC_TYPE_CHACHA20(默认)
  • CODEC_TYPE_SQLCIPHER

运行时修改加密算法,则可以通过连接参数QSQLITE_USE_CIPHER。例如下面的代码:


 
 
  1. QSqlDatabase dbconn = QSqlDatabase::addDatabase( "SQLITECIPHER");
  2. dbconn.setDatabaseName( "test.db");
  3. dbconn.setPassword( "test");
  4. dbconn.setConnectOptions( "QSQLITE_USE_CIPHER=sqlcipher");

QSQLITE_USE_CIPHER的可选值分别为:

  • aes128cbc
  • aes256cbc
  • chacha20
  • sqlcipher
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是我工作了一天的成果,压缩包内包括Qt sqlite加密驱动所有的代码,以及一个调用例程,还有一个sqlite3shell.exe工具,用于加密数据库命令行下的分析。 使用这个加密驱动很简单,只需以下3步: 1. 将驱动的代码复制到你的app文件夹(共2个文件夹) 2. 在app的pro文件中加入 include(wxsqlite3/wxsqlite3.pri) include(zsqlitecipherdriver/zsqlitecipherdriver.pri) 3. 在需要的地方加入#include "zsqlitecipherdriver.h",这样就可以使用ZSQLiteCipherDriver类了,这个类是继承自QSqlDriver。所以可以传递给 QSqlDatabase::addDatabase。 详细的可以查看压缩包内源码。之后,main函数就可以这么使用sqlite加密驱动: ZSQLiteCipherDriver *driver = new ZSQLiteCipherDriver(); QSqlDatabase db = QSqlDatabase::addDatabase(driver); db.setDatabaseName("test.db"); db.setPassword("123"); db.open(); ... 加密驱动的稳定性没有问题,是我从Qt的开源代码中,找到Sqlite加密的驱动部分,然后修改的。修改的内容不多,最重要的是在数据库的open时,加入了sqlite3_key的调用,实现加密。 底层的加密实现,是来自wxsqlite3-3.0.6。这个我修改了一个宏定义,让其加密方式采用了AES256,而不是原来的AES128。 例程中包括了3个实用的函数,分别用来以某一密码打开或创建一个数据库,判断数据库是否处于解密状态,以及修改数据库密码。 sqlite3shell.exe跟官方提供的sqlite3.exe使用方法一样。只不过对于加密数据库,需要在对数据库进行任何操作前,先执行“PRAGMA key=xxx;”。通过这种方式输入数据库密码。检验之前的密码是否正确可以在命令行中键入“.databases”,如果没有错误提示,那就是解密成功了;如果密码错误,只能关闭sqlite3shell.exe,从头尝试了。 虽然这个资源,要的分数确实有点多,不过评价之后就能返还的。我相信这个资源值这个价值!下载后在Qt5上可以直接编译。不需要任何修改。Qt4上没试过,不承诺一定可用,但是应该没问题。
### 回答1: Linux QtSqlite加密是指在Linux系统上使用QtSqlite库对数据库进行加密处理的过程。QtSqlite是基于SQLite的C++库,用于在Qt框架下操作数据库。SQLite是一种轻型、嵌入式的数据库引擎,广泛用于各种应用程序的数据存储和管理。 要在Linux上使用QtSqlite加密功能,可以借助Qt提供的QtCipherSqlitePlugin插件QtCipherSqlitePlugin是一个用于对SQLite数据库进行加密和解密的插件,它可以在数据库打开和关闭的过程中对数据进行加密和解密操作,保护数据库的机密性。 使用QtCipherSqlitePlugin进行加密时,先需要在Qt应用程序中加载该插件,并将其注册到数据库驱动中。然后,可以通过设置数据库的加密密钥和算法类型来指定加密方式。常见的加密算法包括AES和DES等。 加密后的数据库文件在存储和传输过程中更加安全,无法直接被读取和修改。在使用数据库时,需要提供正确的密钥才能解密数据进行操作。而没有密钥的人则无法对数据库进行读写操作,保证了数据的机密性和安全性。 总而言之,Linux QtSqlite加密QtCipherSqlitePlugin的使用可以有效保护数据库的安全。通过对数据库进行加密处理,可以防止敏感数据的泄漏和篡改,为应用程序和用户提供更高的数据安全保障。 ### 回答2: Linux QtSQLITE加密是指在Linux操作系统中使用QtSQLITE库进行数据库操作时,对数据库进行加密的过程。QtSQLITE是一个用于在Qt应用程序中访问和操作SQLite数据库的插件QtCipherSQLitePlugin是一个在Qt应用程序中使用的SQLite数据库加密插件。它提供了一种轻松而安全的方法来对SQLite数据库进行加密和解密操作。使用QtCipherSQLitePlugin,我们可以通过在连接到数据库之前设置加密密钥来保护数据库中的数据。这样,即使数据库文件被非法访问,也无法获取到其中的明文数据。 要使用QtCipherSQLitePlugin,首先需要在项目中添加相应的插件文件,并在代码中进行相关设置。然后,我们可以在代码中使用QtSQLITE库提供的API进行数据库操作,如创建表、插入数据、查询数据等。在连接到数据库之前,我们可以通过使用QtCipherSQLitePlugin提供的接口设置加密密钥,以保护数据库中的数据。 使用Linux QtSQLITE加密QtCipherSQLitePlugin可以有效地保护数据库中的敏感数据。通过加密数据库,即使数据库文件被非法获取,也无法直接获取到其中的明文数据。这样可以提高数据的安全性,并保护用户的隐私。 总结来说,Linux QtSQLITE加密QtCipherSQLitePlugin是一种用于在Linux操作系统中使用QtSQLITE库对SQLite数据库进行加密的解决方案。它提供了一种简单而安全的方法来保护数据库的数据,加强数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值