Du musst Dich bei aktuellen Methoden [ password_hash() / password_verify() ] um den Salt gar nicht kümmern. Das machen sozusagen andere für Dich.
Wenn Du Dir das Beispiel angesehen hättest, dann hättest Du gesehen, dass die Hilfsfunktion für die Erzeugung eines Salt nur für crypt() und Apache-MD5 notwendig ist. Übrigens, wenn Du das binäre Hilfsprogramm htpasswd mal anschaust und benutzt:
htpasswd -nbB foo GeHeim - dann kommt ab Apache 2.4 etwas wie
foo:$2y$05$GRnDYvydQpyX2yNF6yqByej4gZ8JHyixOlbo7pgd468yrFCvLFIX6
heraus. Erhöht man die Rundenzahl ("Kosten") auf 2^10=1024:
htpasswd -nbB -C 10 foo GeHeim foo:$2y$10$uJBSt4P3JLFHAagMWuBhWuB14QfCtCvjO0s0r5cl1kBKoCGN1fSEy
foo ist der Benutzer...
Die PHP-Funktion password_hash('GeHeim') liefert:
$2y$10$ztCfKHQF1u.90ubdtbApYunjcR7gG2EFZaUjZMGPZ7mnH5puQlVvi
Deshalb geht ab apache 2.4 auch sowas:
<?php
$password="geHeim";
$Kosten=6; # Werte von (4 ...31)
# Vorsicht: Mit 2^31=2.147.483.648 Runden kann das eine ganze Weile dauern...]
# Passwort mit htpasswd hashen:
$s='htpasswd -nbB -C '. $Kosten . ' foo ' . escapeshellarg($password);
# htpasswd -nbB -C 6 foo "geheim"
$line=trim(`$s`);
$a=explode(':', $line, 2);
$password_hash=$a[1];
echo $password_hash, "\n";
# Hash mit PHP-Funktion password_verify testen:
if ( password_verify($password, $password_hash) ) {
echo "verifiziert\n";
} else {
echo "SHIT HAPPENS\n";
}
Das ist dann einer Gründe dafür, , gut bekannte und fertige Funktionen zu benutzen. Hat man aber früher mal alte, mit der Apache-MD5-Methode gehashte Passwörter erzeugt und muss die weiter benutzen, dann versagt die PHP-Funktion password_verify():
Man kann es dann so machen wie ich in dem Beispiel. Und natürlich sollte man dann die Benutzer darauf hinweisen, dass die das Passwort wechseln sollen, weil es bisher auf eine Weise gespeichert ist, die künftig nicht mehr als sicher gilt.
Jörg Reinholz