Genau die gleiche hashing in java, PHP mit Salz? (SHA-256)
Kann ich einfach den hash in PHP mit einer Salz:
$orig_pw = "abcd";
$salt = 5f8f041b75042e56;
$password = hash('sha256', $orig_pw . $salt);
(Dies ist nicht wie ich es umsetzen, das ist nur ein Beispiel. Salz ist für jeden anders)
Und mit diesem, wird das gespeicherte Passwort ist:
bc20a09bc9b3d3e1fecf0ed5742769726c93573d4133dbd91e2d309155fa9929
Aber wenn ich versuche das selbe in Java, bekomme ich ein anderes Ergebnis. Ich habe versucht String password = "abcd";
byte[] salt = hexStringToByteArray("5f8f041b75042e56");
try {
System.out.println(new String(getHash(password, salt)));
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
Und die beiden Methoden:
public byte[] getHash(String password, byte[] salt) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
try {
return digest.digest(password.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
public byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
Ist das Ergebnis:
/¬1¶ĆĽëüFd?[$?¶»_9ËZ»ç¶S‘Ęŗש
Welche codiert hex ist noch nicht einmal nah:
2fac31b6434c14ebfc46643f5b243fb6bb5f39cb5abb10e7b65391454c97d7a90d0a
Kann mir jemand helfen mit diesem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abgesehen von der Reihenfolge getauscht, wie sieht es in PHP-Sie sind der Behandlung der salt-Wert als Zeichenkette angehängt, um das Passwort, während in Java Sie einen hex-Umwandlung des Salzes ersten und verwenden Sie dann die resultierende Byte zum aktualisieren der
MessageDigest
. Dies wird offensichtlich zu unterschiedlichen Ergebnissen führen. Betrachtet man nur das Salz:PHP: Salz -> bytes (literal) -> SHA-256
Java: Salz -> bytes (unhex) -> SHA-256
Habe ich gerade versucht, den Java-code, und es ist absolut in Ordnung. Ich habe auch versucht, den gleichen hash-Wert in PHP als in Java und es gab mir identische Ergebnisse.
Java-äquivalent zum PHP-code wäre:
Nach hexing das Byte gibt das folgende Ergebnis zurück:
Und in PHP machen:
Zurück genau das gleiche.
"abcd"."5f8f041b75042e56"
. Zu tun das äquivalent in Java würden Sie zu tun haben("password" + "salt").getBytes("UTF-8")
und dann verdauen, dass.Ich denke
ist äquivalent zu:
Also den hash und Salz vertauscht. Können Sie dies bestätigen?