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

