由于在开发中遇到需要将对应的sqlite数据库进行一个加密,于是当然就首先看看sqlite自己有没有.... 然后 果然有预留接口,不过是空的。。官方实现要几百刀。。。所以果断只能第三方的插件库了。 查了一下有好多实现加密的插件,当然这里就选择了其中一个而已,github的地址:https://github.com/devbean/QtCipherSqlitePlugin,这是基于wxSQLite3的加密,详细的就可以了解:http://wxcode.sourceforge.net/components/wxsqlite3/。
后来去插件的作者的博客,还看到了比较详细的两篇的文章,这里也贴一下http://www.devbean.net/2012/07/qt-sqlite-plugin-with-encryption/,http://www.devbean.net/2013/01/qt-sqlite-plugin-with-encryption-v02/。
源码下下来包含了加密插件的源码还有一个测试的程序,首先需要修改sqlitecipher/qt_p.pri中对应的qt的代码位置,之后就可以编译sqlitecipher.pro项目了,编译debug和release后分别把生成的sqlitecipherd.dll 和sqlitecipher.dll 拷到对应的qt安装目录的sql驱动插件目录下plugins/sqldrivers下,就能在程序里进行使用了,使用测试程序先测试一下插件的运行请款就好了。
在这个插件中实现的其实就是实现了qtsqlitedriver的一个open的函数,添加了密码等参数,做了一个调整后编译了一个类似于QSQLite的SQLITECIPHER驱动,然后在sqlite3中预留的空实现sqlite3_key也予以实现加密的东西。详细的看一下源码以及作者的博客。
使用的话就相当简单了,因为驱动插件也进行了重写和编译,所以使用就和之前使用数据库是相同的,就是调用的驱动名不同了,然后需要设置一个密码:
QSqlDatabase dbconn = QSqlDatabase::addDatabase("SQLITECIPHER");
dbconn.setDatabaseName("../test.db");
dbconn.setPassword("psw");
if (!dbconn.open()) {
qDebug() << "Can not open connection.";
exit(CONNECTION_FAILED);
}
然后在这个地方,setPassword调用的时候,如果数据库还没有建立,那么就是设置一个密码,如果数据库已经设定存在,那么就是使用这个密码来进行数据库的访问。这样就是对于数据库的一个基本的保护了。