Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 当我测试使用SecretKeyFactory散列密码的程序时,它总是返回不同的密码_Java - Fatal编程技术网

Java 当我测试使用SecretKeyFactory散列密码的程序时,它总是返回不同的密码

Java 当我测试使用SecretKeyFactory散列密码的程序时,它总是返回不同的密码,java,Java,在我的代码中,我尝试使用SecretFactory的PBKDF2WithHmacSHA1实例散列密码。 (在此之前,您将看到O生成随机盐) 但是,当我尝试在一个简单的java项目中使用两个相同的密码测试该程序时,它会给我一个响应,即它们不相同。原因可能是什么 tatic byte[] salt = new byte[16]; public static String password = "peachy"; public static String newpassword = "peachy";

在我的代码中,我尝试使用
SecretFactory
PBKDF2WithHmacSHA1
实例散列密码。 (在此之前,您将看到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);
   }

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

有关更多信息,请参阅和Jon Skeet的答案

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


有关更多信息,请参阅和Jon Skeet的答案。

谢谢!顺便说一句,在我读你的评论之前,我正在读关于比较字节[]的文章,我意识到了我的错误!!非常感谢。非常感谢。顺便说一句,在我读你的评论之前,我正在读关于比较字节[]的文章,我意识到了我的错误!!非常感谢。
 return Arrays.equals(hashOfInput,storedPassword);