Ich habe eine einfache GUI mit einem Passwortfeld, einer Enter-Taste und einem Textbereich erstellt, um den erzeugten Hash des Passworts anzuzeigen, wenn die Eingabetaste gedrückt wird. Aber wenn ich den Knopf erneut drücke, ändert sich der Hash, obwohl das Passwort immer noch gleich ist. Ich kann das eingegebene Passwort nicht mit dem gespeicherten Passwort vergleichen, da sich der Ausgabe-Hash jedes Mal ändert. HierJava-Implementierung von PBKDF2 mit HMAC SHA1 gibt verschiedene Hash-Werte jedes Mal zurück, wenn eine Taste gedrückt wird?
ist der Code:
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;
}
Es nur geben den gleichen Hash jedes Mal, wenn ich es aus dem Haupt Methode aufrufen. Warum das? Wie kann ich jedes Mal, wenn ich dasselbe Passwort eingib und den Knopf drücke, den gleichen Wert zurückgeben?
Ich denke, dass ich das Problem herausfinden, wenn verdeckte Zeichenfolge vor und zurück zu chararray. Editieren Sie die Methode hashPassword zu hashPassword (char [] password, String salt) und es funktioniert jetzt.
Irgendwie, wenn String in CharArray konvertieren, Ausgabe ist jedes Mal unterschiedlich. Hier ist der Testcode:
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
Es ist sehr seltsam, da pw0 und PW1 sind gleich „Passwort“ .toCharArray(). Ich frage mich, ob es in String.toCharArray() einen Fehler gibt ??
Eine gesalzene Hash per Definition ist jedes Mal anders - aus einem Grund. Warum sollten Sie erwarten, dass sie gleich sind? Wenn dies das ist, was Sie wollen, füttern Sie immer dasselbe Salz. Aber bitte tu das nicht in der Produktion. – fge
@fge, das gleiche Salz sollte den gleichen Hash-Wert zurückgeben. –
Beginnen Sie mit der Vereinfachung des Problems und testen Sie einfach die 'hashPassword'-Methode, indem Sie sie mit festen Werten von der Hauptmethode aufrufen und die Ausgabe an System.out ausgeben. –