zoukankan      html  css  js  c++  java
  • 给 Qt sqlite 增加加密功能

    整合sqlite代码

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

    修改qt源码

    • 打开 qtbasesrcsqlkernelqsqldriver.h,声明两个新的接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      /**
      * @brief 设置数据库密码
      * @param key - 密码
      */
      virtual bool setKey(const QString& key);

      /**
      * @brief 重置数据库密码
      * @param key - 密码
      */
      virtual bool resetKey(const QString& key);
    • 打开 qtbasesrcsqlkernelqsqldriver.cpp,给新增的两个接口增加一个默认实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      bool QSqlDriver::setKey(const QString&)
      {
      return false;
      }

      bool QSqlDriver::resetKey(const QString&)
      {
      return false;
      }
    • 打开 qtbasesrcsqldriverssqliteqsql_sqlite_p.h,继承那两个新的接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      /**
      * @brief 设置数据库密码
      * @param key - 密码
      */
      bool setKey(const QString& key);

      /**
      * @brief 重置数据库密码
      * @param key - 密码
      */
      bool resetKey(const QString& key);
    • 打开 qtbasesrcsqldriverssqliteqsql_sqlite_p.cpp,继承那两个新的接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      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/

  • 相关阅读:
    内联函数和宏
    C++内联函数与宏定义
    C++函数声明和定义深度解析
    C++中的头文件和源文件
    国外程序员整理的 C++ 资源大全
    c语言中的字符数组与字符串
    iOS应用架构谈(二):View层的组织和调用方案(中)
    iOS应用架构谈(一):架构设计的方法论
    解决xib约束冲突
    tableView设置首尾
  • 原文地址:https://www.cnblogs.com/findumars/p/6336422.html
Copyright © 2011-2022 走看看