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

Java 1.8 Signature.sign()抛出BadPaddingException的原因排查求助

RSA签名在Ubuntu服务器抛出BadPaddingException,但测试用例及本地运行正常

我开发的Spring Boot应用会在请求时返回经过签名的非敏感信息,遇到一个诡异问题:应用在同事的Ubuntu服务器上运行时,会在RSACore.java:200处抛出BadPaddingException,但在我的Windows机器、该Ubuntu服务器上运行测试用例均能通过;且应用在Windows和Mac机器上能正常运行,返回的签名对象可正常验证。

精简后的签名逻辑代码:

Signature signer = Signature.getInstance("SHA1withRSA");
PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(PRIVATE_KEY_BYTES));
signer.initSign(key);
signer.update(BASE_64_ENCODED_STRING.getBytes());
byte[] bytes = signer.sign();//仅在Ubuntu服务器运行应用时抛出异常
//返回包含byte[] 'obj'和Base64.getEncoder().encodeToString(bytes) 'sig'的对象

在两台机器上均能成功运行的测试用例代码:

response = callAboveCode(BASE_64_ENCODED_STRING);
Signature verify = Signature.getInstance("SHA1withRSA");
PublicKey key = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(PUBLIC_KEY_BYTES));
verify.initVerify(key);
verify.update(response.obj);
assertTrue(verify.verify(Base64.getDecoder().decode(response.sig)));

已确认以下信息:

  • 两台机器的公钥、私钥byte[]完全一致
  • 使用相同版本的JDK 1.8
  • 输入的BASE_64_ENCODED_STRING内容一致
  • 无法重新生成公钥私钥,因为已在生产环境使用,且Windows机器生成的签名可正常工作

尝试将Signature的Provider切换为BouncyCastleProvider后,仍出现类似错误,错误来自BouncyCastle的RSABlindedEngine中针对Arjen Lenstra的CRT攻击检查逻辑,对应代码行:if (!input.equals(result.modPow(e, m)))。

求排查方向或类似问题的解决经验!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:33