RSA-SHA256签名算法行为不符预期,Node.js Crypto技术问询
为什么RSA-SHA256签名解密后和直接哈希的结果不匹配?
你对RSA签名的理解是简化版的,实际标准的RSA-SHA256签名并不是直接用私钥加密SHA256哈希值,而是遵循PKCS#1 v1.5规范,流程比你想的多一步:
- 对消息计算SHA256哈希值
- 把哈希值和SHA256算法的ASN.1标识(OID:1.3.14.3.2.26)打包成DER编码的ASN.1结构
- 对这个ASN.1结构做RSA私钥加密(带PKCS#1填充),最终得到合法签名
回到你的代码:
createSign('RSA-SHA256')生成的签名是标准流程的产物,用publicDecrypt解密后得到的不是纯哈希值,而是包含ASN.1头的完整结构。比如解密后的字节序列开头会是3031300d060960864801650304020105000420这类ASN.1 DER编码,后面才是你计算的32字节SHA256哈希值。- 你直接计算的
hash是纯32字节哈希,自然和解密后的完整结构十六进制不匹配。
另外,你手动用privateEncrypt加密哈希的做法不符合标准签名规范——缺少ASN.1结构和正确的填充逻辑,生成的"签名"无法被其他遵循PKCS#1标准的系统验证。
正确的验证方式就是用createVerify,它会自动处理ASN.1解析、填充校验和哈希对比,所以你的代码里isVerified会返回true,这才是标准的签名验证流程。
内容的提问来源于stack exchange,提问作者Rob Lyndon
相关产品推荐
相关产品推荐

