【Qt】SQLite3 数据库加密

文章目录
  1. 1. Set Connect options
  • 创建数据库密码 QSQLITE_CREATE_KEY
  • 删除数据库密码 QSQLITE_REMOVE_KEY
  • 更新数据库密码 QSQLITE_UPDATE_KEY
  • Set Connect options

    • Provided by Qt SqlitePlugin
      • QSQLITE_BUSY_TIMEOUT
      • QSQLITE_OPEN_READONLY
      • QSQLITE_OPEN_URI
      • QSQLITE_ENABLE_SHARED_CACHE
    • Added by QtCipherSqlitePlugin
      • QSQLITE_CREATE_KEY
      • QSQLITE_UPDATE_KEY
      • QSQLITE_REMOVE_KEY

    创建数据库密码 QSQLITE_CREATE_KEY

    如果输出中有 SQLITECIPHER 的名字,那么恭喜你,插件没有问题!
    为没有加密的数据库增加密码
    Qt 默认提供的 SQLite 插件是没有加密功能的。新版本的 QtCipherSqlitePlugin 支持为原本没有加密的数据库增加密码,使用方法如下:
    C++

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

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

    删除数据库密码 QSQLITE_REMOVE_KEY

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

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

    更新数据库密码 QSQLITE_UPDATE_KEY

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

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    bool QUpdateDB::setDBConfig(QSqlDatabase* dbconn, QMap<ENUM_SQLKEY, QString> qMapCfg)
    {
    for (auto it : qMapCfg.toStdMap())
    {
    if (it.first <= QSQLITE_REMOVE_KEY)
    {
    dbconn->setPassword(it.second);
    dbconn->setConnectOptions(GETOBJNAME(it.first));
    }
    else if (it.first == QSQLITE_UPDATE_KEY)
    {
    dbconn->setPassword(it.second);
    dbconn->setConnectOptions(QString("%1=%2").arg().arg());
    }

    }
    }