使用OpenSSL生成的HMAC-SHA256哈希与在线工具结果不匹配
解决HMAC-SHA256与在线工具结果不匹配的问题
核心排查与修复步骤
1. 改用固定密钥,保证测试可复现
随机生成的密钥每次运行都不同,无法和在线工具做有效对比。替换成你之前输出的固定二进制密钥:
// 替换main函数中gen_secret的调用,使用固定密钥 unsigned char secret[] = {0x49, 0xd8, 0x86, 0x99, 0x9b, 0x10, 0xfa, 0xb3, 0xb7, 0x67, 0x24, 0x52, 0x7e, 0x12, 0x69, 0x62, 0x83, 0x13, 0x88, 0x60};
2. 密钥编码必须严格对应
你提到双方都用base32编码密钥,这里要注意:
- 程序中的
secret是原始二进制数据,需要转成base32字符串(比如上述固定密钥转base32为J5XGIZJAOZXXMZJAMZRWG4TBNZSGS3Q)后,再输入在线工具 - 若在线工具要求输入原始二进制密钥,则需把hex格式的密钥(
49 d8 86 ... 60)转换为二进制后输入,而非base32编码
3. 哈希输出格式要统一
你的程序输出的是十六进制格式的哈希(如4f 2f bc ... b4),在线工具可能默认输出base64或其他格式,需手动设置在线工具输出十六进制,再对比结果。
用上述固定密钥和数据some data to be hashed,程序输出的哈希十六进制为:
4f2fbcb83e927778770eab4f57b309f1883353e7a67f16206dc5f5a56a2695b4
切换在线工具输出为十六进制后,结果应与该值完全一致。
4. 补充代码错误调试逻辑
你的hmac_sha256函数逻辑基本正确,可添加错误打印方便排查:
int hmac_sha256(const unsigned char *key, int key_size, const unsigned char *data, int data_size, unsigned char *md_buffer, unsigned int md_size) { if (md_size < 32) return -2; unsigned int out_len; if (!HMAC(EVP_sha256(), key, key_size, data, data_size, md_buffer, &out_len)) { // 打印OpenSSL错误信息 ERR_print_errors_fp(stderr); return -1; } if (out_len != 32) return -3; return 0; }
5. 确认输入数据完全一致
确保在线工具输入的数据与程序中的"some data to be hashed"完全相同:无多余空格、换行符,编码为UTF-8(C++ std::string默认UTF-8,只要编译环境编码正确即可)。
内容的提问来源于stack exchange,提问作者jnl
相关产品推荐
相关产品推荐

