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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:33:18