给 Qt sqlite 增加加密功能

整合sqlite代码

  • 开源的sqlite中没有实现加密的功能,所以如果需要加密功能,需要自己实现 sqlite3_key sqlite3_rekey 等相关函数
  • 不过开源的 wxsqlite3中已经实现了加密,所以只要将这里的代码整合到qt 中就行,主要是将其实现的 sqlite3_key sqlite3_rekey 等函数添加到 qtsqlite3.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,声明两个新的接口

    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);
  • 打开 qtbase\src\sql\kernel\qsqldriver.cpp,给新增的两个接口增加一个默认实现

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

    bool QSqlDriver::resetKey(const QString&)
    {
    return false;
    }
  • 打开 qtbase\src\sql\drivers\sqlite\qsql_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);
  • 打开 qtbase\src\sql\drivers\sqlite\qsql_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