用 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_out20;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_CTX(OpenSSL 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智研社是一个专注于人工智能领域的综合性平台
相关推荐
GuWenyue2 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%想会飞的蒲公英3 小时前
计算机怎样读取中文文本:编码、清洗与标准化Miao121313 小时前
某海外住宿平台如何在大规模场景下实现指标一致性:Minerva 指标平台实践SeaTunnel4 小时前
从 Python Script 地狱到标准化数据集成框架CodexDave4 小时前
MySQL事务隔离级别与MVCC机制解析深度研习笔记4 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现曾阿伦4 小时前
MongoDB 查询语句备忘手册一叶龙洲4 小时前
wslg打开Ubuntu24.04默认打开图形界面CCPC不拿奖不改名4 小时前
大模型推理架构与开源生态知识整理