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

OpenSSL 3.0低级别MD5 API迁移至高等级EVP API问题咨询

OpenSSL 3.0 MD5废弃问题EVP API适配方案

替换代码实现

你可以直接封装一个兼容原有MD5函数签名的自定义函数,完全适配OpenSSL 3.0的高等级API要求:

#include <openssl/evp.h>

unsigned char *compat_MD5(const unsigned char *data, size_t data_len, unsigned char *out_hash)
{
    EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
    static unsigned char static_buf[EVP_MAX_MD_SIZE];
    unsigned int hash_len;

    // 兼容原MD5函数逻辑:输出指针为空则使用内部静态缓冲区
    if (out_hash == NULL) {
        out_hash = static_buf;
    }
    if (md_ctx == NULL) {
        return NULL;
    }

    // 初始化MD5计算上下文
    if (EVP_DigestInit_ex(md_ctx, EVP_md5(), NULL) != 1) {
        EVP_MD_CTX_free(md_ctx);
        return NULL;
    }
    // 输入待计算的原始数据
    if (EVP_DigestUpdate(md_ctx, data, data_len) != 1) {
        EVP_MD_CTX_free(md_ctx);
        return NULL;
    }
    // 输出最终MD5哈希结果
    if (EVP_DigestFinal_ex(md_ctx, out_hash, &hash_len) != 1) {
        EVP_MD_CTX_free(md_ctx);
        return NULL;
    }

    // 安全清理上下文并释放资源
    EVP_MD_CTX_free(md_ctx);
    OPENSSL_cleanse(md_ctx, sizeof(*md_ctx));
    return out_hash;
}

调用方式

原有代码中的if (!MD5((uint8_t*)key.data(), key.size(), hashOutput))直接替换为if (!compat_MD5((uint8_t*)key.data(), key.size(), hashOutput))即可,无需修改其他业务逻辑。

注意事项

  • 需要包含头文件#include <openssl/evp.h>替代原来的md5.h
  • 编译时仍需链接crypto库,编译参数保留-lcrypto即可
  • 若有EBCDIC编码适配需求,可参考原有MD5实现中的编码转换逻辑,在EVP_DigestUpdate调用前添加对应转换代码即可
  • 该实现兼容OpenSSL 1.1.0及以上所有版本,升级到OpenSSL 3.0后不会再触发废弃警告

内容的提问来源于stack exchange,提问作者bourne

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:24:03