我在解密文本時遇到了一些問題:我的后端在解密過程中經常拋出 IllegalBlockSizeException:javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher當我再次嘗試(1-3 次)時,它終于可以成功解密 SAME 文本并將響應發(fā)送給 FE。正如我注意到的那樣,當我嘗試在短時間內解密許多(大約 100 個)字符串時,通常會發(fā)生這種情況(2 個請求來自 FE,從 db/請求查詢 15 個記錄,2 個加密字段/記錄)我的服務器在帶有 Raspbian 的 Raspberry Pi B+ 上運行?!捌胀ā盤C 上不存在此問題。加密類:package bookmarks.common.encryption.base;import java.nio.charset.StandardCharsets;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.SecretKeySpec;import org.apache.commons.net.util.Base64;import lombok.extern.slf4j.Slf4j;@Slf4jpublic class DefaultEncryptor { private static final int SIZE = 16; private static final String ALGORITHM = "AES"; private static final Base64 BASE_64 = new Base64(); private final Key key; private final Cipher cipher; public DefaultEncryptor(String password) { byte[] key = createKey(password); this.key = new SecretKeySpec(key, ALGORITHM); try { cipher = Cipher.getInstance(ALGORITHM); } catch (NoSuchAlgorithmException | NoSuchPaddingException e) { log.error("Error creating encryptor.", e); throw new RuntimeException(e); } } private byte[] createKey(String password) { if (password.length() < SIZE) { int missingLength = SIZE - password.length(); StringBuilder passwordBuilder = new StringBuilder(password); for (int i = 0; i < missingLength; i++) { passwordBuilder.append(" "); } password = passwordBuilder.toString(); } return password.substring(0, SIZE).getBytes(StandardCharsets.UTF_8); }有什么想法會導致問題嗎?
2 回答

浮云間
TA貢獻1829條經驗 獲得超4個贊
僅使用AES
沒有 IV 的密碼意味著使用AES/ECB/PKCS5Padding
. 此密碼和模式要求解密輸入是塊大?。?28 位)的倍數(shù)
Input length must be multiple of 16 when decrypting with padded cipher
密碼抱怨輸入不是 16 的倍數(shù)
正如我注意到的那樣,當我嘗試在短時間內解密許多(大約 100 個)字符串時,通常會發(fā)生這種情況
我想到了什么(正如詹姆斯評論的那樣,這是我有根據(jù)的猜測),密碼對象不是線程安全的。我很有信心地說要么
輸入被傳遞為不完整(您可能想要記錄輸入字節(jié)數(shù)組長度)
有多個線程重用同一個密碼對象

開心每一天1111
TA貢獻1836條經驗 獲得超13個贊
問題是靜態(tài)常量 BASE_64,什么不是線程安全的。當多個請求同時到達時,spring-boot并行處理,base64解碼返回損壞結果,當然無效數(shù)據(jù)無法解密。
添加回答
舉報
0/150
提交
取消