如何使用Java在XML文件中保存加密/散列密码

时间:2017-10-09 07:29:33

标签: java xml encryption passwords

我想将密码保存在XML文件中。但是明文不够安全。所以我想将它保存在散列值或加密数据中。但我不知道该怎么做。由于MD5或SHA-2是单向散列。或者,如果我使用盐,它应该保存盐的价值。

那我该怎么办?请帮我解决这个问题。

1 个答案:

答案 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