当我使用SecretKeyFactory测试我的程序哈希密码时,它总是返回密码是不一样的

时间:2013-04-24 05:57:01

标签: java

在我的代码中,我尝试使用PBKDF2WithHmacSHA1 SecretFactory实例来哈希密码。 (在此之前你会看到O产生随机盐)

但是当我尝试在一个简单的java项目中测试程序时,两个密码是相同的,它给了我一个不一样的响应。可能是什么原因?

tatic byte[] salt = new byte[16];
public static String password = "peachy";
public static String newpassword = "peachy";

public static byte []storedpassword;

public static void main(String[] args) throws Exception {

    generateSalt();
    System.out.println("salt1:"+salt.toString());
    storedpassword=hash(password,salt);
    System.out.println(storedpassword.toString());
    boolean answer = check(newpassword, storedpassword);
    System.out.println(answer);


}
public static void generateSalt()
{
     Random randomno = new Random();
     randomno.nextBytes(salt);

}

private static byte[] hash(String password, byte[] salt) throws Exception   
{  
    SecretKeyFactory f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 65536, 128);

    return f.generateSecret(spec).getEncoded();

}
public static boolean check(String givenPassword, byte[] storedPassword)
   throws Exception{
        System.out.println("salt2:"+salt.toString());
        byte[] hashOfInput = hash(givenPassword,salt);
        System.out.println(hashOfInput.toString());
        return hashOfInput.equals(storedPassword);
   }

}

1 个答案:

答案 0 :(得分:3)

 return Arrays.equals(hashOfInput,storedPassword);

您无法使用byte[]方法比较.equals(),请使用上面的代码。你无法使用.equals()方法比较它们的原因是因为byte[]的equals()方法测试引用相等,而不是逻辑(每个字节是相同的)相等。这是因为byte[]继承自Object,这就是Objectequals()方法的实现方式。

有关详细信息,请参阅this question和Jon Skeet的答案。