OpenSSL 3环境下HMAC256 C++旧API代码适配求助(新手)
适配OpenSSL 3的HMAC-SHA256实现代码更新
OpenSSL 3.0 废弃了HMAC_CTX_new()、HMAC_CTX_free()等旧版HMAC API,改用基于EVP_MAC的统一接口。以下是更新后的代码,完全兼容OpenSSL 3环境:
#include <openssl/evp.h> #include <string> #include <vector> #include <sstream> #include <iomanip> // 假设signatureRawData是已定义的输入数据容器 // std::vector<unsigned char> signatureRawData = ...; const std::string secretKey = "secret"; std::vector<unsigned char> signature(signatureRawData.begin(), signatureRawData.end()); // SHA256的HMAC输出固定为32字节,提前分配缓冲区 std::vector<unsigned char> signatureBytes(EVP_MD_size(EVP_sha256())); size_t signatureLength = 0; // 创建HMAC上下文并指定算法 EVP_MAC_CTX* macCtx = EVP_MAC_CTX_new(EVP_MAC_fetch(nullptr, "HMAC", nullptr)); if (!macCtx) { // 错误处理:上下文创建失败,可根据需求抛出异常或终止程序 return; // 示例退出逻辑,实际项目需调整 } // 配置HMAC使用SHA256算法,并设置密钥 OSSL_PARAM params[] = { OSSL_PARAM_construct_utf8_string("digest", (char*)"SHA256", 0), OSSL_PARAM_construct_end() }; if (EVP_MAC_init(macCtx, reinterpret_cast<const unsigned char*>(secretKey.data()), secretKey.size(), params) != 1) { // 错误处理:初始化失败 EVP_MAC_CTX_free(macCtx); return; } // 输入待签名数据 if (EVP_MAC_update(macCtx, signature.data(), signature.size()) != 1) { // 错误处理:数据更新失败 EVP_MAC_CTX_free(macCtx); return; } // 生成最终HMAC结果 if (EVP_MAC_final(macCtx, signatureBytes.data(), &signatureLength, signatureBytes.size()) != 1) { // 错误处理:结果生成失败 EVP_MAC_CTX_free(macCtx); return; } // 释放上下文资源 EVP_MAC_CTX_free(macCtx); // 将二进制签名转换为十六进制字符串 std::ostringstream signatureHex; signatureHex << std::hex << std::setfill('0'); for (size_t i = 0; i < signatureLength; ++i) { signatureHex << std::setw(2) << static_cast<int>(signatureBytes[i]); } std::string requestSignatureHexString = signatureHex.str();
关键改动说明
- 接口替换:用
EVP_MAC_CTX系列接口替代旧的HMAC_CTX,这是OpenSSL 3推荐的统一密码学操作接口 - 缓冲区优化:将签名结果缓冲区大小设置为SHA256的固定输出长度(32字节),避免不必要的内存分配
- 错误处理:新增关键步骤的返回值检查,符合OpenSSL的错误处理规范,减少潜在崩溃风险
- 精准转换:十六进制转换仅处理实际生成的签名字节,避免原代码中多余的空字节转换问题
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

