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




