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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:42:35