PHP Fragen zu passwort_hash() und passwort_verify()

Jack159

Lieutenant
Registriert
Dez. 2011
Beiträge
766
Hallo,

Seit PHP 5.5 ist ja passwort_hash() die gängige Funktion, um Passwörter zu hashen.
Bevor das Passwort aber gehasht wird, wird an dem Passwort noch ein "Salt" angehangen (zufällige Zeichenkette). Es wird also letzendlich das Passwort+Salt als gesamtes gehasht. Der Salt wiederrum wird jedesmal zufällig neu generiert, sodass wenn man 2x das selbe Passwort hashen würde, am Ende niemals den selben Hash erhält.


Jett sei folgendes Beispiel gegeben:

PHP:
	<?php
		
		$pw = "hallo";
		$hash = password_hash($pw, PASSWORD_DEFAULT);	

                echo $hash;	
				
		if (password_verify($pw, $hash)) {
			echo "Correct";
		} else {
			echo "False";
		}
		

	?>

1. Frage:
Das ganze funktioniert wie gewünscht. Was mich aber wundert ist, wie die Überprüfung der Funktion "password_verify()" genau aussieht. Weil die Funktion "password_verify()" kennt ja den Salt nicht?!



2. Frage:

Folgendes Beispiel:

PHP:
	<?php
		
		for ($i=0; $i < 5; $i++) { 
			echo password_hash("hallo", PASSWORD_DEFAULT);
			echo "<br>";
		}
		

	?>

Erzeugt folgende Ausgabe:
$2y$10$6aO7rY3RUgxO/hTvkf3vbOzwmMOQNeRwWm9pnB6E0WyFCHxwzD7BW
$2y$10$5LmOzbC/Dg.hn4/Zkdi4vuUNECalQSjDLZMhGPMMWeCYv3dnn0I3m
$2y$10$WwxW5lf1zcLoosAsvXrINuDWSIerveBxtEtLnFixPUC8diJKn2d2q
$2y$10$od7Kr/CYef3FEi68G1VgXuWlshn2LWno4QPT0H1R1Rkq6WKlQD3mG
$2y$10$XotsXy4p5G1d.kp36PmjNutEhPEkkLx/7d22e1ISH9IDsgyY9uLfe


Wieso steht bei jedem Hash am Anfang "$2y$10$" ? Was ist das? Selbst wenn ich das Skript erneut laufen lasse, steht wieder "$2y$10$" am Anfang jeder Zeile. Nur der Rest danach ist immer verschieden.
 
Das sollte alle Fragen klären:

Every bcrypt hash consists of 60 chars with the following structure:

$[crypt algorithm]$[2 digits workload factor]$[22 chars salt][31 chars hash]

So the hash $2a$05$DlVuKqx7WmxlDdbE4mXHCucpz0D.0F27m4R0C8vrd4yhDlK7YkOwm consists of the following parts:

crypt algorithm: 2a for bcrypt
workload factor: 05
salt: DlVuKqx7WmxlDdbE4mXHCu
real hash: cpz0D.0F27m4R0C8vrd4yhDlK7YkOwm
Quelle: eigene Doku einer privaten Bcrypt-Library (seit PHP 5.5 nicht mehr benötigt :))



Und hier die Erklärung warum auch 2y als Crypt Algorithm Bcrypt entspricht.
 
Zuletzt bearbeitet:
Zurück
Oben