给 Qt sqlite 增加加密功能

整合sqlite代码

  • 开源的sqlite中没有实现加密的功能,所以如果需要加密功能,需要自己实现 sqlite3_keysqlite3_rekey 等相关函数
  • 不过开源的 wxsqlite3中已经实现了加密,所以只要将这里的代码整合到qt 中就行,主要是将其实现的 sqlite3_key sqlite3_rekey 等函数添加到 qt 的 sqlite3.c 中
  • 这里有一份已经整合好的代码qt_sqlite_driver.zip
    • 直接解压到 qtbase\src\3rdparty 下就行
    • 整合主要的修改如下:
      • 修改了 sqlite.pri 编译配置文件
      • 修改了 sqlite\sqlite3.c 文件
      • 增加了 sqlite\codec.c(.h) sqlite\rijndael.c(.h) sqlite\sha2.c(.h)

修改qt源码

  • 打开 qtbase\src\sql\kernel\qsqldriver.h,声明两个新的接口

    1234567891011
    /** * @brief 设置数据库密码 * @param key - 密码 */virtual bool setKey(const QString& key);
    
    /** * @brief 重置数据库密码 * @param key - 密码 */virtual bool resetKey(const QString& key);
  • 打开 qtbase\src\sql\kernel\qsqldriver.cpp,给新增的两个接口增加一个默认实现
    123456789
    bool QSqlDriver::setKey(const QString&){    return false;}
    
    bool QSqlDriver::resetKey(const QString&){    return false;}
  • 打开 qtbase\src\sql\drivers\sqlite\qsql_sqlite_p.h,继承那两个新的接口
    1234567891011
    /** * @brief 设置数据库密码 * @param key - 密码 */bool setKey(const QString& key);
    
    /** * @brief 重置数据库密码 * @param key - 密码 */bool resetKey(const QString& key);
  • 打开 qtbase\src\sql\drivers\sqlite\qsql_sqlite_p.cpp,继承那两个新的接口
    123456789101112131415161718192021
    bool QSQLiteDriver::setKey(const QString& key){    Q_D(QSQLiteDriver);    if (d->access)    {        return (SQLITE_OK == sqlite3_key(d->access, key.toStdString().c_str(), key.toStdString().size()));    }
    
        return false;}
    
    bool QSQLiteDriver::resetKey(const QString& key){    Q_D(QSQLiteDriver);    if (d->access)    {        return (SQLITE_OK == sqlite3_rekey(d->access, key.toStdString().c_str(), key.toStdString().size()));    }
    
        return false;}

编译qt

动态编译 Qt 5.6
静态编译 Qt 5.6

http://wangjie.rocks/2016/05/10/qt-sqlite-cipher/

时间: 2024-12-25 08:43:55

给 Qt sqlite 增加加密功能的相关文章

cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨

注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用. 很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的. 这个问题尽早会来到我面前,这不?现在就来了.一开始,自然想使用最省工的了:但是,这样的好事并不多,极少极少...... 于是,我先搜罗了一些现成的文章拿来一阅. 1,Sqlite数据库加密解密 SRC: http://blog.sina.com.cn/s/blog_

SQLite XXTea加密学习

这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了.所以,估计想兼容以前数据库是很困难的了.. 十分推荐他的博客:SQLite学习笔记(十)&&加密    Sqlite学习笔记(一)&&编译安装 sqlite3.6.18加密模块change(讨论) sqlite3 加解密 SQLITE3 加密总结 sqlite3+使用总结 SQ

iOS: Sqlite数据库的功能:建表,增加,删除,修改,查找

 本篇主要介绍Sqlite数据库的功能:建表,增加,删除,修改,查找. 采用封装的方法写的,继承于NSObject. 需向工程中添加libsqlite3.tbd库. #import "DataBaseHandle.h" //引入头文件 #import <sqlite3.h> @interface DataBaseHandle() //用来存放数据库的路径 @property (nonatomic,strong) NSString *filePath; @end @imple

【转载】TexturePacker 如何使用自带的加密功能及在cocos2dx中的使用

在cocos2dx中使用纹理图集是非常节省资源的,在这里推荐 TexturePacker,而且 TexturePacker工具的加密接口也非常的好用,下面就来介绍一下... TexturePacker 工具的加密,只是相对于一般使用的基础上增加了几步对密码操作的步骤(目前的加密功能仅适用于.pvr.ccz格式): 一.生成密码(图形化界面和命令行两种方式) 方式一:图形化界面生成密码 密码可以自己手动过输入,或者使用下面的这几个按钮,完后点击外面的空白区域就自动保存了... (2)shell脚本

TexturePacker 如何使用自带的加密功能及在cocos2dx中的使用

在cocos2dx中使用纹理图集是非常节省资源的,在这里推荐 TexturePacker,而且 TexturePacker工具的加密接口也非常的好用,下面就来介绍一下... TexturePacker 工具的加密,只是相对于一般使用的基础上增加了几步对密码操作的步骤(目前的加密功能仅适用于.pvr.ccz格式): 一.生成密码(图形化界面和命令行两种方式) 方式一:图形化界面生成密码 密码可以自己手动过输入,或者使用下面的这几个按钮,完后点击外面的空白区域就自动保存了... (2)shell脚本

学习ASP.NET Core Razor 编程系列九——增加查询功能

学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面 学习ASP.NET C

Kitkat的加密功能对应用做了什么?

本文只分析手机加密后,启动到输入密码的界面的流程. 一. 加密后,系统服务针对加密功能做了什么? 最先启动的是SystemServer,调用ServerThread的initAndLoop()方法,开始启动系统的其他的服务. 在该文件中搜索"crypt",得到如下内容: 1. private static final String ENCRYPTING_STATE = "trigger_restart_min_framework"; private static f

QT SQLite 多数据库操作大全

QT SQLite 多数据库操作大全 一.单数据库模型 一般QT都是把打开一个缺省数据库连接,操作一个数据库连接,但是对Sqlite中频率修改容易加锁,因此有一种设计模式是把频率修改的表放在不同的数据库文件中,但这样要修改代码操作数据库部分 通常打开代码 http://developer.nokia.com/community/wiki/Creating_an_SQLite_database_in_Qt bool DatabaseManager::openDB() { // Find QSLit

为ecshop红包增加”转赠”功能

ecshop促销中使用红包激励用户购物,要想炒热活动,红包就需要有物以稀为贵的感觉.有人求有人送,这样红包之间的转赠有助于拉动第二梯队的顾客.但是如果已经把红包添加到自己的账户了怎么办?如果ecshop红包的使用再加上什么限制(比如,一个单只能用一个红包,就够坑爹的),现在来做一个线上转赠红包的功能. 最模板简单的实现一下: 首先了解,红包存放在ecs_user_bonus表中,他的归属区分很简单:通过user_id来决定红包属于谁的. 此功能涉及到四个文件:/js/user.js .  /us