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

内核中public_key_verify_signature返回-74(EBADMSG)的问题求助

问题原因及解决方法

核心问题

你在代码中直接传入了原始SHA-256哈希值,但内核的PKCS#1签名验证逻辑要求传入的是包含哈希算法标识的PKCS#1 DigestInfo结构,而非裸哈希。

OpenSSL的openssl dgst -sha256 -sign命令在签名时,会自动将原始哈希值封装进PKCS#1的DigestInfo结构后再进行RSA签名;而内核的public_key_verify_signature(底层调用rsa_pkcs1_verify)在验证时,会期望签名对应的明文是这个完整的DigestInfo结构,而非裸哈希,因此直接传裸哈希会导致验证失败,返回EBADMSG。

DigestInfo结构格式

SHA-256对应的DigestInfo ASN.1结构DER编码前缀为:
0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20
将这段前缀拼接在原始SHA-256哈希值前,就是内核验证需要的完整数据。

修改后的关键代码片段

// SHA-256 DigestInfo结构 + 原始哈希值"123"
static u8 _digest[] = {
    0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,
    0xa6,0x65,0xa4,0x59,0x20,0x42,0x2f,0x9d,0x41,0x7e,0x48,0x67,0xef,0xdc,0x4f,0xb8,0xa0,0x4a,0x1f,0x3f,0xff,0x1f,0xa0,0x7e,0x99,0x8e,0x86,0xf7,0xf7,0xa2,0x7a,0xe3
};

struct public_key_signature sig = {
    .s = _sign,
    .s_size = (u32)(sizeof(_sign)), //256
    .digest = _digest,
    .digest_size = 50, // 修正为DigestInfo结构的总长度(19字节前缀+32字节哈希)
    .pkey_algo = "rsa",
    .hash_algo = "sha256",
    .encoding = "pkcs1",
};

验证逻辑说明

内核PKCS#1验证流程:

  1. 使用公钥解密签名得到明文
  2. 检查明文是否符合PKCS#1的DigestInfo格式(包括算法OID匹配)
  3. 提取其中的哈希值与传入的哈希值对比
    如果传入的是裸哈希,第二步格式检查会直接失败,返回EBADMSG。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:42:03