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
相关产品推荐
相关产品推荐

