我使用以下(代码段)代码来加密用户'私有数据存储在数据库中,然后解密,以便他们可以查看它。
Cipher cipher = Cipher.getInstance("DESede");
byte[] bytes = cipher.doFinal(value.getBytes());
String encrypted = new String(bytes);
然后将此String存储在varchar列下的数据库中
要解密:
Cipher cipher = Cipher.getInstance("DESede");
byte[] bytes = cipher.doFinal(value.getBytes());
String decrypted = new String(bytes);[code]
现在看似随机我偶尔会得到
javax.crypto.BadPaddingException: Given final block not properly padded
答案 0 :(得分:3)
您从加密获得的数据是二进制。您无法安全地将byte[]
转换为String
并将其转换回来,因为并非所有字节都有来回的1-1映射。您可以将数据保存在可以处理二进制数据的字段中,也可以使用不会丢失数据的编码对数据进行编码,例如 base64 或 Hex 编码
答案 1 :(得分:1)
String encrypted = new String(bytes);
问题就在这里。 String
不是二进制数据的容器。如果您必须拥有byte[]
,请使用String
或hex或base64编码。