【问题标题】:How to saved encrypted/hashing password in XML file using Java如何使用 Java 在 XML 文件中保存加密/散列密码
【发布时间】:2018-03-20 08:03:43
【问题描述】:

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

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

【问题讨论】:

  • 如果你保存了密码,但它是加密的,那么它很容易被攻击者解密。使用加盐哈希的原因是,给定真实密码并以相同的方式对其进行哈希处理,您可以在不离开客户端机器的情况下比较密码。
  • @Dragonthoughts 感谢您的回复。我只知道盐是一个随机字符串,它会与密码一起散列。对密码更有保护。但是我不知道更多关于加盐密码的细节,你能更详细地解释一下加盐密码是如何工作的吗?谢谢
  • 你好,@patjing,真的是哈,而不是密码。如果您不对散列加盐,那么任何人都可以通过使用具有相同散列的不同密码来重现它 - 请参阅彩虹攻击。哈希涉及的数学很复杂,所以我使用了简化。加盐修改原始数据,以阻止这种情况。例如,如果“Hello”的哈希是 1234,那么我们在密码中添加一个盐,我们会得到一个不同的哈希。因此,假设我们在开头添加一个 *,这将彻底改变哈希值,但更重要的是可以防止彩虹攻击。例如有 "*Hello" 可能是 45454

标签: java xml encryption passwords


【解决方案1】:

您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 2013-10-15
    • 2018-11-20
    • 2020-09-23
    • 2021-04-17
    相关资源
    最近更新 更多