【发布时间】:2021-04-10 07:36:15
【问题描述】:
使用以下方法生成 AES 密钥后:
keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
keyGenerator.generateKey();
我将这个密钥与一个 16 字节的 IV 连接起来,然后进行编码
public String encode(byte[] content) {
return Base64.encodeBase64String(content);
}
我将此字符串传递给 RSA 密码,如下所示
private final Cipher publicKeyCipher = Cipher.getInstance("RSA");
publicKeyCipher.init(Cipher.ENCRYPT_MODE, publicKey);
publicKeyCipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
所有这些都按预期正常工作,并且测试工作正常。但是当在受控环境中进行负载测试时,doFinal 函数会抛出
{"log":"javax.crypto.IllegalBlockSizeException: Data must not be longer than 245 bytes\n"}
这发生在 500,000 个请求中的 0-15% 左右。日志显示字符串长度和字节大小始终固定在 70 表示低于 245。 所以我不认为这是一个编码问题,我在从一个失败的实例中对其进行加密之前打印了字符串,并在单元测试中对其进行了测试,没有任何问题通过。
【问题讨论】:
-
这可能是您的 JCE 中的错误,但也可能是您的代码中的错误。 32 字节密钥 + 16 字节 IV 组成 48 字节。如果 base64 编码,它应该是 64 而不是 70。你能创建一个 minimal reproducible example 来证明你的问题吗?
-
供参考,可能有用knowledgefactory.net/2020/10/…
-
顺便说一句,当前显示的代码很好。
-
没有理由在 加密数据之前对数据进行 base64 编码。
标签: java spring encryption public-key-encryption