【问题标题】:Password encryption method never returns the same result for the same parameters密码加密方法永远不会为相同的参数返回相同的结果
【发布时间】:2013-08-27 16:00:32
【问题描述】:

我有found 代码利用java.security.* 来加密密码。但是当我使用它时,它不起作用。每次调用 encrypt 方法的参数都一样(encrypt() 方法中显示的参数,而且每次都一样),得到不同的结果,这当然让代码没用了。这是我的代码:

public byte[] encrypt(String clearPassword, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
    System.out.println(clearPassword+"     **********     "+salt);
    String algorithm = "PBKDF2WithHmacSHA1";
    int derivedKeyLength = 1600;
    int iterations = 20000;

    KeySpec spec = new PBEKeySpec(clearPassword.toCharArray(), salt, iterations, derivedKeyLength);
    SecretKeyFactory f = SecretKeyFactory.getInstance(algorithm);
    byte [] truc = f.generateSecret(spec).getEncoded();
    System.out.println(truc);
    return truc;
}

public byte[] generateSalt() throws NoSuchAlgorithmException {
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] salt = new byte[8];
    random.nextBytes(salt);

    return salt;
}

我想我在某些时候在原始代码中引入了一个错误,但我看不出在哪里。有什么想法吗?

【问题讨论】:

  • 你能发布示例输出和调用代码吗?您是否每次都基于自播 PRNG 生成新盐?

标签: java security encryption passwords


【解决方案1】:

这是因为System.out.println(truc); 并没有按照你的想法去做。如果您尝试过:

System.out.println(Arrays.toString(truc));

您将打印数组的实际内容,每次调用具有相同参数的方法时,该内容应该相同。

例如:printing arrays

【讨论】:

  • 最糟糕的是我今天早上就记住了它。有时我觉得自己很笨。谢谢你,阿西利亚斯
  • 也有可能是他给encrypt喂了不同的盐。
  • @chrylis 他说根据第一个println语句参数是一样的,所以不太可能。
  • @assylias 好吧,他是这么说的,但他还在该语句中打印了 salt 数组的 JVM ID...
  • @assylias:我已经使用 Arrays.toString() 检查了结果,你是对的。我只是在等待强制性的 5 分钟以接受您的回答...
猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多