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

Java生成RSASSA-PSS签名,C#验证无效问题求助

Java生成RSASSA-PSS签名后.NET验证失败的问题排查

一、Java代码中的致命错误

你的Java代码最后一步存在低级错误:

byte[] byteArraySignature = signer.sign();
signature = encoder.encodeToString(message); // 此处逻辑错误

你将**原始消息message**做Base64编码后赋值给了signature,而非实际生成的签名结果byteArraySignature。正确代码应为:

signature = encoder.encodeToString(byteArraySignature);

这是导致验证失败的最直接原因。

二、PSS参数一致性检查

修复上述错误后,需确保Java与.NET的PSS参数完全匹配:

Java侧参数配置

你设置的PSSParameterSpec参数:

  • 哈希算法:SHA-512
  • MGF1算法:SHA512
  • 盐长度:64
  • Trailer字段:1(对应PSS标准的0xBC trailer值)

.NET BouncyCastle代码参数修正

当前BouncyCastle代码未显式指定MGF1哈希算法与Trailer字段,需调整为:

var signer = new PssSigner(
    new RsaEngine(), 
    new Sha512Digest(), 
    new Sha512Digest(), // 显式指定MGF1使用SHA512
    64, 
    PssSigner.TrailerFieldBC // 指定Trailer字段为0xBC,与Java侧一致
);

.NET原生API参数匹配

若使用.NET原生VerifyData方法,RSASignaturePadding.Pss的默认参数已与你的Java配置匹配:

  • MGF1算法与主哈希算法(SHA512)一致
  • 盐长度默认等于哈希值长度(SHA512为64)
  • Trailer字段默认是0xBC
    修复Java侧签名赋值错误后,原生API的验证代码即可正常工作。

三、额外注意事项

  • 确保Java与.NET使用同一密钥对:Java用PKCS8格式私钥,.NET读取的公钥需对应同一密钥对。
  • 统一消息编码:两边均使用UTF-8编码消息,这一点你已正确实现。
  • 密钥读取可靠性:Java读取私钥时建议使用StandardCharsets.UTF_8替代Charset.defaultCharset(),避免环境字符集差异导致密钥损坏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 11:15:42