You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:00:55