我尝试用java加密字段,但我无法解密它。
我不发送数据,我只是希望它在插入时加密并在检索时解密。
我使用了这段代码,但解密不起作用。
public void setkey() throws Exception {
byte[] key1 = new String("abcd").getBytes("UTF-8"); // some logic will replace "abcd"
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
key1 = messageDigest.digest(key1);
key1 = Arrays.copyOf(key1,16);
key = key1;
//this key must be the same when encrypting and decrypting, right?
}
@Override
public String encryptField(Myclass myClass) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
String encryptedField = Base64.encodeBase64String(cipher.doFinal(myClass.myField.getBytes("UTF-8")));
myClass.setMyField(encryptedField);
save(myClass);
return encryptedField;
//this looks OK, and gives me 24 character string.
}
@Override
public String decryptVoucher(Myclass myClass) throws Exception {
String skey = key.toString();
Cipher cipher = Cipher.getInstance("AES");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decryptedField = cipher.doFinal(Base64.decodeBase64(yClass.myField.getBytes("UTF-8")));
// decryptedField.toString() is not as same as original data...
return decryptedField.toString();
}
答案 0 :(得分:1)
问题是您在字节数组上调用toString
方法。 toString
为您提供数组对象的String表示形式;它不会尝试将数组的内容转换为String。您看到的输出是“[B @ 798b429b”的行,对吗?
要将解密的字节转换为String对象,请使用new String(decryptedField, "UTF-8")
。这将正确地将字节转换为字符。
请记住,Java无法知道字节数组包含表示字符的数据。 toString
类上的Array
方法返回数组的描述,而不是其内容。它使用默认的toString
实现,即:
getClass().getName() + '@' + Integer.toHexString(hashCode())
(来自http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString%28%29)
在这种情况下,类名是“[B”,意思是“字节数组”。