Ubuntu 22.10下OpenSSL 3.0调用SHA1 HMAC算法失败求助
问题分析与解决
你的核心错误是混淆了摘要算法和MAC算法的概念:
SHA1属于哈希摘要算法范畴,而EVP_MAC_fetch()是专门用于获取MAC(消息认证码)算法(比如HMAC)的接口,直接传入"SHA1"自然找不到对应的MAC实现。- 你用
openssl list -digest-algorithms查询到的是摘要算法列表,和MAC算法分属不同类别,可执行openssl list -mac-algorithms查看系统支持的MAC算法,会看到HMAC是其中的核心条目。
修正后的代码方案
要实现基于SHA1的HMAC,需先获取HMAC算法实例,再指定使用SHA1作为底层摘要算法,以下两种写法均可:
写法1:通过属性直接指定摘要算法
#include <openssl/evp.h> #include <openssl/err.h> int main() { // 获取HMAC算法,同时指定底层使用SHA1摘要 EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", "digest=SHA1"); if (mac == NULL) { ERR_print_errors_fp(stderr); return 1; } EVP_MAC_free(mac); return 0; }
写法2:在MAC上下文中设置摘要算法
#include <openssl/evp.h> #include <openssl/err.h> int main() { EVP_MAC *mac = EVP_MAC_fetch(NULL, "HMAC", NULL); if (mac == NULL) { ERR_print_errors_fp(stderr); return 1; } // 创建MAC上下文用于配置参数 EVP_MAC_CTX *ctx = EVP_MAC_CTX_new(mac); if (ctx == NULL) { ERR_print_errors_fp(stderr); EVP_MAC_free(mac); return 1; } // 为HMAC指定SHA1作为摘要算法 if (!EVP_MAC_CTX_set_params(ctx, OSSL_PARAM_construct_utf8_string("digest", "SHA1", 0))) { ERR_print_errors_fp(stderr); EVP_MAC_CTX_free(ctx); EVP_MAC_free(mac); return 1; } EVP_MAC_CTX_free(ctx); EVP_MAC_free(mac); return 0; }
验证编译运行
用你原来的编译命令即可正常执行:
cc -o test -Wall test.c -lcrypto ./test
此时不会再出现算法不支持的错误提示。
内容的提问来源于stack exchange,提问作者Archie
相关产品推荐
相关产品推荐

