Passwörter mit Java und PHP

Moin,

ich habe hier eine Methoden in PHP - Erzeugen eines Hashs für ein Passwort


public function setPassword($password, $rounds = '3') {
	$this->hash = $this->randomShortHash();
	$string = hash_hmac ( "whirlpool", str_pad ( $password, strlen ( $password ) * 4, sha1 ( $this->email ), STR_PAD_BOTH ), $this->hash, true );
	$salt = substr ( str_shuffle ( './0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' ) , 0, 22 );
	$password = crypt ( $string, '$2a$' . $rounds . '$' . $salt );
	$this->password = $password;
}

nun muss ich den gleichen Hash für das Passwort über Java erzeugen - ick habe NULL Ahnung wie das geht bzw. wonach ich suchen muss :frowning:

Hätte da jemand mal einen Tipp für mich?

danke, mogel

Dass die Salt Komponente zufällig erzeugt wird, ist dir aber bewusst? Was heißt denn „den gleichen Hash“, muss das Verfahren gleich sein, hast du den Salt Wert und musst daraus das selbe PW generieren… ?

ja ist mir bewusst - ich komme prinzipiell an alle nötigen Informationen die in PHP verwendet werden auch unter Java ran

Okay, wollte nur sicherstellen, dass wir vom selben Thema sprechen :wink:

Die php.net Doku ist doch eigentlich recht hilfreich:

http://docs.php.net/manual/de/function.crypt.php
Basiert auf DES

http://www.php.net/manual/de/function.hash-hmac.php
HMAC kannte ich bisher auch noch nicht, hier versucht zumindest jmd eine Java Implementierung (einer Variante davon): http://stackoverflow.com/questions/7124735/hmac-sha256-algorithm-for-signature-calculation

Das scheint z.B. mit der javax.crypto API zu funktionieren.

Für „randomShortHash()“ müsste man natürlich die Methode sehen

ich schau mir das mal an - denke aber das ich den Passwort/Hash/Verschlüsselungsteil nochmal etwas anpassen werde

Mit der crypt Funktion kann man nicht nur DES basiert hashen. In diesem Fall wird blowfish verwendet, was man an der Verwendung von $2a$ als Präfix des salt sieht.
Mit der crypt Funktion werden Hashes erzeugt, wie sie z. B. in der /etc/shadow Datei auf Unixsystemen auftauchen.

Wenn ich mich nicht irre, fehlt in der Zeile 6 noch ein . '$': $password = crypt ( $string, '$2a$' . $rounds . '$' . $salt . '$');

Ich habe mal kurz gegooglet und bin dabei auf diese Seiten gestoßen:
http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#Mac

Demzufolge kann Java standardmäßig keinen Whirlpool-Hash und dadurch auch keinen Whirlpool-HMAC berechnen.

*** Edit ***

Ich denke, mit gnu crypto solltest du weiterkommen, sofern die Lizenz es dir erlaubt, die Bibliothek zu nutzen.

Kurzes lesen der Doku lässt mich vermuten, dass dein Code zum Erzeugen des HMAC in etwa so aussehen müsste (ungetestet!):

IMac whirlpool = MacFactory.getInstance("hmac-whirlpool");
whirlpool.update(password.getBytes("UTF-8"), 0, password.length());
byte[] hmac = whirlpool.digest();```