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

OpenSSL签名时向SHA256哈希添加了什么?签名验证异常求助

为什么OpenSSL签名后的验证输出会多19字节?

哈哈,这个问题我之前也碰到过!那额外的19字节其实是OpenSSL在签名/验证过程中自动添加的ASN.1/DER格式的DigestInfo结构头,用来标准化哈希的算法标识,确保验证方知道用什么算法去解析后续的哈希值。

具体拆解这19字节的结构

SHA256对应的DigestInfo的DER编码头是固定的19字节,内容如下:

30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

每个部分的含义:

  • 30 31:ASN.1的SEQUENCE标签,声明后续内容是一个序列,总长度为0x31(49字节,包含后面的算法标识和32字节哈希)
  • 30 0d:嵌套的SEQUENCE标签,长度0x0d(13字节),用来描述哈希算法的详细信息
  • 06 09:OBJECT IDENTIFIER(OID)标签,长度0x09(9字节),对应SHA256的标准OID 2.16.840.1.101.3.4.2.1
  • 60 86 48 01 65 03 04 02 01:SHA256的OID的具体编码值
  • 05 00:NULL标签,长度0x00,代表SHA256算法不需要额外参数
  • 04 20:OCTET STRING标签,长度0x20(32字节),后面紧跟的就是你原本期望的原始SHA256哈希值

如何获取纯原始哈希值?

如果验证后只想得到纯32字节的SHA256哈希,可以用openssl asn1parse来解析并提取:

# 验证后直接提取原始哈希并查看
openssl dgst -sha256 -verify pubkey.pem -signature signature file | openssl asn1parse -inform der -noout -out - | xxd -g 1

或者先保存验证输出再处理:

# 保存验证输出
openssl dgst -sha256 -verify pubkey.pem -signature signature file > hash.verified
# 解析提取纯哈希
openssl asn1parse -inform der -in hash.verified -noout -out hash.raw
# 查看纯哈希
xxd -g 1 hash.raw

这样hash.raw里就是和直接生成的hash.sha256完全一致的纯SHA256哈希值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:26:33