使用YubiKey签名SHA512摘要返回无效签名问题排查
问题排查方向
1. OpenPGP签名格式与常规secp256k1签名的差异
OpenPGP的ECDSA签名并非直接输出r和s的原始字节,而是包裹在ASN.1 DER编码结构中:
SEQUENCE { r INTEGER, s INTEGER }
多数加密货币工具、库期望的是原始r+s拼接的64字节格式(或带恢复ID的65字节),你从YubiKey拿到的DER编码签名直接给这些库验证自然失败。而noble-secp256k1支持解析DER格式,所以部分场景能通过。
2. SHA512摘要的额外处理
OpenPGP签名时会对哈希值做拼接处理:将哈希算法的OID前缀与SHA512哈希值组合后再签名。比如secp256k1搭配SHA512时,OID前缀为0x3051300d060960864801650304020305000440,加上64字节的SHA512哈希,总长度为91字节。如果你直接把原始SHA512哈希传给YubiKey签名,但验证时用原始哈希去校验,就会出现不匹配——因为实际签名的是带OID前缀的组合数据。
3. s值的规范化差异
ECDSA签名要求s值必须小于曲线阶的一半(low-s规范),部分库严格遵循该规则,但OpenPGP实现可能不强制做s值规范化。如果YubiKey返回的s值大于曲线阶的一半,那些严格校验的库会判定签名无效,而noble-secp256k1可能自动处理了s值的规范化,所以能通过验证。
4. 公钥格式不匹配
你用于验证的公钥格式可能与YubiKey导出的OpenPGP格式不一致。OpenPGP公钥是包含曲线OID、公钥点等信息的ASN.1编码结构,而多数加密货币库期望的是压缩/非压缩的原始公钥字节(33或65字节),直接用OpenPGP公钥验证会因格式错误失败。
内容的提问来源于stack exchange,提问作者Bruno Zell
相关产品推荐
相关产品推荐

