我有一个第三方API,必须以加密形式以JSON发送数据。 JSON中的数据如下所示:
{
"encryptedKey": "rltP+oNBMx26wSpmvKZ91iL=",
"encryptedData": "u5o+ON08CNGLwvt8OUmHXFPAzfk3uPILANA="
}
注意: json值中的数据被裁剪为仅显示示例。
我正在使用Java11HttpClient将此请求发送到给定的端点。带有所有加密值的请求得到了很好的处理,并且我得到了与请求相同的期望结果(响应再次出现在键值对JSON中,并且值已加密)。
{
"encryptedKey": "rltP+oNmvKZ91iL=",
"encryptedData": "u5ot8OUmHXFPAzfk3uPILANA="
}
我必须再次解密此JSON“ encryptedKey”以获取实际内容。使用“ RSA / ECB / PKCS1Padding”完成解密。因此,当我传递该cryptoKey的字符串来解密代码时,它会给我BadPaddingException。
javax.crypto.BadPaddingException: Decryption error
at java.base/sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:378)
at java.base/sun.security.rsa.RSAPadding.unpad(RSAPadding.java:290)
at java.base/com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:366)
at java.base/com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:392)
at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2202)
我正在使用以下代码:
HttpRequest request = HttpRequest.newBuilder().POST(BodyPublishers.ofString(requestPayload))
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("Accept", "application/json")
.headers(buildHeaders(headers).toArray(String[]::new)).build();
HttpResponse响应= httpClient.send(请求, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
上面的代码可以很好地用于请求,并以与预期相同的结构给我答复。但是问题似乎出在String响应反序列化的过程中。
选项2:当我选择从代码生成的加密请求时,如果将该请求添加为Postman中的有效负载,则会得到类似的响应。现在,如果我从Postman响应中解密该加密密钥,则使用相同的代码库,它将为我提供有效的数据,而无需填充异常。
需要在Spring或Java11等库中发送请求和处理响应数据的方式的建议。
到目前为止,我已经尝试了Unirest,Java11HttpClient和OkHttp,但结果相同。
谢谢。