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的标准OID2.16.840.1.101.3.4.2.160 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
相关产品推荐
相关产品推荐

