gpt4 book ai didi

每次按下按钮时,Java 对 PBKDF2 和 HMAC SHA1 的实现都会返回不同的哈希值?

转载 作者:行者123 更新时间:2023-11-29 04:48:47 25 4
gpt4 key购买 nike

我创建了一个简单的 GUI,其中包含一个密码字段、一个输入按钮和一个文本区域,用于在按下输入按钮时显示生成的密码哈希值。但是当我再次按下按钮时,即使输入的密码仍然相同,哈希也会发生变化。我无法将输入的密码与存储的密码进行比较,因为输出哈希值每次都会更改。

代码如下:

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;

public PBKDF2() {
initComponents();
}

private void initComponents() {//"Generated Code"
......
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
password= jPasswordField1.getPassword();
jTextArea1.setText(null);
try {
jTextArea1.append(hashPassword(password.toString(), "salt"));
} catch (NoSuchAlgorithmException | InvalidKeySpecException ex) {
Logger.getLogger(PBKDF2.class.getName()).log(Level.SEVERE, null, ex);
}
}

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new PBKDF2().setVisible(true);
}
});
}

public static String hashPassword(String password, String salt) throws NoSuchAlgorithmException, InvalidKeySpecException{
char[] pw = password.toCharArray();
byte[] slt = salt.getBytes(StandardCharsets.UTF_8);
PBEKeySpec spec = new PBEKeySpec(pw,slt,2000,160);
SecretKeyFactory key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] hashedPassword = key.generateSecret(spec).getEncoded();
return String.format("%X", new BigInteger(hashedPassword));
}

public static char[] password;
public javax.swing.JButton jButton1;
public javax.swing.JPasswordField jPasswordField1;
public javax.swing.JScrollPane jScrollPane1;
public javax.swing.JTextArea jTextArea1;
}

如果我从 main 方法调用它,它每次只返回相同的散列。这是为什么?每次我输入相同的密码并按下按钮时,如何让它返回相同的值?

我认为我在将字符串来回转换为 chararray 时发现了问题。将方法 hashPassword 编辑为 hashPassword(char[] password, String salt) 并使其正常工作。

不知何故,当将 String 转换为 CharArray 时,每次输出都不同。这是测试代码:

Code:
char[] pw0="password".toCharArray();
char[] pw1="password".toCharArray();

jTextArea1.append("\nCase1: "+hashPassword(pw0.toString(), "salt"));
jTextArea1.append("\nCase2:"+hashPassword(pw1.toString(), "salt"));

Result:
Case1: -48b7cb730ce85dd46cb2cac6960eb1971f2d30e4
Case2:64765fbdada52d536d89bf2fac72b058397e9ec9

这很奇怪,因为 pw0 和 pw1 等于“password”.toCharArray()。我想知道 String.toCharArray() 是否有错误??

最佳答案

从技术上讲,你打电话

"abc".toCharArray().toString();

这将导致

[C@abcdef10

因此,每次运行它时,您得到的总是另一个值。

你应该做的是:

jTextArea1.append("\nCase1: "+hashPassword(new String(pw0), "salt"));
...

关于每次按下按钮时,Java 对 PBKDF2 和 HMAC SHA1 的实现都会返回不同的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com