用 OpenSSL 的 HMAC() 函数计算 HMAC-SHA1 最稳妥传 EVP_sha1()、准确的 key 指针与长度、20 字节输出缓冲大文件需流式处理用 HMAC_CTX_new() HMAC_Update()对比前确保双方均为原始字节统一 hex 或 base64 解码并排除换行/BOM/路径差异。怎么用 OpenSSL 在 C 里算 HMAC-SHA1 签名直接调 HMAC() 函数最稳别自己拼接 key 和数据再喂给 SHA1() —— 那不是 HMAC是错的。OpenSSL 的 HMAC() 会自动处理 key 填充、两次哈希等细节。常见错误传入的 key 长度超过 SHA1 分块大小64 字节没做预哈希或者把 base64 编码后的签名当原始字节比对。HMAC() 第一个参数必须是 EVP_sha1()不是 SHA1()key 指针和长度要准确const unsigned char* int别传 std::string::c_str() 后忘掉 .length()输出缓冲区至少留 20 字节SHA1 输出长度别开 16 字节——那是 MD5 的unsigned char hmac_out[20];unsigned int hmac_len;HMAC(EVP_sha1(), key, key_len, data, data_len, hmac_out, hmac_len);// hmac_len 一定是 20但还是要传地址给它填验证文件签名时怎么读文件又不崩内存大文件不能一次性 fread() 到内存再算 HMAC —— 不是算不准是可能 OOM 或触发系统限制。HMAC 支持流式更新得用 HMAC_CTXOpenSSL 1.1.1 推荐用 HMAC_CTX_new()。容易踩的坑在循环读文件时反复调 HMAC_Init_ex() 重置上下文结果只算最后一块或者忘了在 HMAC_Final() 后调 HMAC_CTX_free()导致句柄泄漏。立即学习“C免费学习笔记深入”初始化一次 HMAC_CTX然后循环 HMAC_Update()每块数据用 fread(buf, 1, BUFSIZ, fp) 读别用 fgets()会截断二进制Windows 下打开文件必须用 rb 模式否则换行符被转义签名必然不匹配对比签名时为什么 memcmp 总是失败不是算法问题大概率是编码或截断惹的祸。原始 HMAC 输出是 20 字节二进制如果服务端返回的是 base64 或 hex 字符串你本地没解码就直接 memcmp()肯定失败。 AI智研社 AI智研社是一个专注于人工智能领域的综合性平台