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
相关产品推荐
相关产品推荐

