我想将密码保存在XML文件中。但是明文不够安全。所以我想将它保存在散列值或加密数据中。但我不知道该怎么做。由于MD5或SHA-2是单向散列。或者,如果我使用盐,它应该保存盐的价值。
那我该怎么办?请帮我解决这个问题。
答案 0 :(得分:0)
您可以使用javax.crypto
包来加密/解密密码。
首先,您必须定义加密密钥和加密初始化向量。例如:
String secret = "Foo12345Bar12345";
String initVector = "randomInitVector";
然后你可以编写加密/解密密码的方法。
public static String encrypt(String value, String secret, String initVector) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes());
SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
return Base64.encodeBase64String(encrypted);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static String decrypt(String value, String secret, String initVector) {
try {
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes());
SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, keySpec, iv);
byte[] decrypted = cipher.doFinal(Base64.decodeBase64(str));
return new String(decrypted);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
要运行此代码,您需要将apache依赖项添加到项目
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
此外,Java 8已经有解码/编码Base64的工具:
java.util.Base64.getDecoder()
和java.util.Base64.getEncoder()
因此您可以用Java 8 impl替换Apache