Ich habe versucht, das Java-Passwort authentifizieren zu python replizieren, aber der resultierende Hash ist anders.Java-Password-Hashing-Code in Python replizieren (PBKDF2WithHmacSHA1)
Passwort: abcd1234
Passwort-Token (Java): $ 31 $ 16 $ sWy1dDEx52vwQUCswXDYMQMzTJC39g1_nmrK384T4-w
generiertes Passwort-Token (Python): PBKDF2 16 $ $ $ c1d5MWRERXg1MnZ3UVVDcw $ qPQvE4QbrnYJTmRXk0M7wlfhH5U
Aus dem Java-Code ist die Iteration 16, SALT sollte die erste 16 char in sWy1dDEx52vwQUCswXDYMQMzTJC39g1_nmrK384T4-w, die sWy1dDEx52vwQU ist Cs und die Hash sollten
jedoch wXDYMQMzTJC39g1_nmrK384T4-w sein, um die Variablen zu Python gab mir ein anderes Hash-Ergebnis der Anwendung, die, qPQvE4QbrnYJTmRXk0M7wlfhH5U, die von Java-Hash unterscheidet.
Wo habe ich verpasst?
Java:
private static final String ALGORITHM = "PBKDF2WithHmacSHA1";
private static final int SIZE = 128;
private static final Pattern layout = Pattern.compile("\\$31\\$(\\d\\d?)\\$(.{43})");
public boolean authenticate(char[] password, String token)
{
Matcher m = layout.matcher(token);
if (!m.matches())
throw new IllegalArgumentException("Invalid token format");
int iterations = iterations(Integer.parseInt(m.group(1)));
byte[] hash = Base64.getUrlDecoder().decode(m.group(2));
byte[] salt = Arrays.copyOfRange(hash, 0, SIZE/8);
byte[] check = pbkdf2(password, salt, iterations);
int zero = 0;
for (int idx = 0; idx < check.length; ++idx)
zero |= hash[salt.length + idx]^check[idx];
return zero == 0;
}
Python:
from passlib.hash import pbkdf2_sha1
def hasher(password):
size = 128
key0 = "abcd1234"
iter = int(password.split("$")[2])
salt0 = password.split("$")[3][0: 16]
hash = pbkdf2_sha1.using(rounds=iter, salt = salt0.encode()).hash(key0)
print(hash.split('$')[4])
return hash
Original-Link für Java-Code: How can I hash a password in Java?