Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java在XML文件中保存加密/哈希密码_Java_Xml_Encryption_Passwords - Fatal编程技术网

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

如何使用Java在XML文件中保存加密/哈希密码,java,xml,encryption,passwords,Java,Xml,Encryption,Passwords,我想将密码保存在XML文件中。但明文不够安全。所以我想把它保存在散列值或加密数据中。但我不知道怎么做。因为MD5或SHA-2是单向散列。或者如果我用盐,它应该可以节省盐的价值 那我该怎么办?请帮我解决这个问题。您可以使用javax.crypto包对密码进行加密/解密 public static String encrypt(String value, String secret, String initVector) { try { IvParameterSpec iv

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


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

您可以使用
javax.crypto
包对密码进行加密/解密

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);
    }
}
首先,您必须定义加密秘密和加密初始向量。例如:

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>

通用编解码器
通用编解码器
1.9
此外,Java 8已经有了对Base64进行解码/编码的工具:
java.util.Base64.getDecoder()
java.util.Base64.getEncoder()
因此,如果您保存密码,但密码是加密的,那么攻击者也很容易对密码进行解密,您就可以将Apache替换为java 8 impl

。使用salted散列的原因是,给定真实密码并以相同的方式对其进行散列,您可以在密码不离开客户端机器的情况下比较密码。@谢谢您的回复。我只知道salt是一个随机字符串,它会用密码散列。这是对密码的更多保护。但是我不知道关于salt密码的更多细节,你能解释一下salt密码是如何工作的吗?谢谢你你好,@patjing,真正被腌制的是哈,而不是密码。如果你不在散列中添加盐,那么任何人都可以通过使用不同的密码和相同的散列来复制它——请参阅Rainbow攻击。散列所涉及的数学是复杂的,所以我使用了一种简化方法。盐析修改原始数据以停止此操作。e、 例如,如果“Hello”的哈希值是1234,那么我们在密码中添加一个salt,就会得到一个不同的哈希值。让我们假设我们在开始时添加一个*,这将从根本上改变散列,但更重要的是将防止彩虹攻击。e、 g.“你好”的字母可能是45454