You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQLCipher加密数据库连接时持续出现hmac校验失败错误的问题求助

SQLCipher加密数据库连接时持续出现hmac校验失败错误的问题求助

大家好,我现在遇到了一个SQLCipher连接加密数据库的棘手问题,折腾了好多次都卡在hmac校验失败的错误上,想请教下有没有朋友遇到过类似情况或者知道怎么解决?

之前的正常使用情况

我之前在项目里集成了SQLite,使用<sqlite3.h>库,数据库的打开、连接和查询操作都完全正常,当时的代码如下:

#include <sqlite3.h>

int callback(void *notUsed, int colCount, char **columns, char **colNames) {
    ///........
}

int main() {
    sqlite3 *db;
    int res = sqlite3_open("test.db", &db);
    if (res != SQLITE_OK) {
        printf("Cannot open database\n");
        exit(1);
    }
    sqlite3_exec(db, "SELECT * FROM test_tables;", callback, NULL, NULL);
    if (db != NULL) {
        sqlite3_close(db);
    }
    return 0;
}

加密数据库后的操作

之后我用passphrase作为密钥类型、页面大小设为1024加密了数据库,接着把SQLCipher集成到项目中,链接的库为:-lsqlcipher -lsqlite3 -lssl -lcrypto -lcrypt32 -lwsock32 -lws2_32。同时我定义了SQLITE_HAS_CODEC 1,按照文档在sqlite_open()之后调用sqlite_key()来设置密钥,修改后的代码如下:

#include <sqlite3.h>
#define SQLITE_HAS_CODEC 1

int callback(void *notUsed, int colCount, char **columns, char **colNames) {
    ///........
}

int main() {
    sqlite3 *db;
    int res = sqlite3_open("test.db", &db);
    res = sqlite3_key(db, "abc", 3); // 我试过传3和4两种长度值
    if (res != SQLITE_OK) {
        printf("Cannot open database\n");
        exit(1);
    }
    sqlite3_exec(db, "SELECT * FROM test_tables;", callback, NULL, NULL);
    if (db != NULL) {
        sqlite3_close(db);
    }
    return 0;
}

遇到的错误

不管我怎么调整参数,总是会触发以下错误日志,完全无法正常查询数据库:

2025-06-29 22:53:57.796: sqlcipher_page_cipher: hmac check failed for pgno=1
2025-06-29 22:53:57.797: sqlite3Codec: error decrypting page 1 data: 1
2025-06-29 22:53:57.797: sqlcipher_codec_ctx_set_error 1

我已经尝试过的方法

  • 调整sqlite_key()中的密钥长度参数:因为我的密钥是"abc",试过传实际长度3,也试过传4
  • 改用PRAGMA语句设置密钥和页面大小:比如执行PRAGMA key='abc';PRAGMA page_size=1024;

但所有尝试都没用,这个hmac校验失败的错误始终出现,我本来只是想正常连接到加密数据库并执行查询,现在完全卡在这里了。有没有朋友能帮忙分析下问题出在哪?

内容来源于stack exchange

火山引擎 最新活动