Auge: passord_verify() hash

Beitrag lesen

Hallo

zu PASSWORD_DEFAULT habe ich selbst cost und salt manuell angegeben z.B.:

$hash = password_hash( 'foo', PASSWORD_DEFAULT, [ 'salt' => 'bar', 'cost' => '8' ] );

irgendwie krig ich es mit password_verify() nich hin, die beiden zu vergleichen. bestimmt n dummer flüchtigkeitsfehler von mir selbst 😕

Ich kann das Problem nachstellen. Lasse ich das Array-Element für den Salt weg, funktioniert die Passworterstellung, mit deinem Array gibt password_hash nur NULL zurück, was bedeutet, dass die Funktion grundsätzlich läuft. Der Default-Hashing-Algorithmus von PHP (aktuell Blowfish (BCrypt)) erlaubt einen händisch angegebenen Salt. Mit PHP7 ist das zwar deprecated, aber immer noch nicht verboten. Mein Hauptproblem an diesem Punkt: Ich sehe keinerlei Fehlermeldungen.

Setze ich für error_reporting den Wert E_ALL, wird auch der Grund für die fehlerhafte Erstellung des Hashes sichtbar. Der Salt ist um Längen zu kurz.

Warning: password_hash(): Provided salt is too short: 3 expecting 22 in /home/pi/Web/sms/client-calls/testing.php on line 7

Mit einem längeren Salt funktioniert der Aufruf. Das Handbuch empfiehlt, den Salt von System erstellen zu lassen. Wenn die händische Vorgabe eines Salt mit PHP7 sowieso missbilligt wurde, ist damit zu rechnen, dass diese Möglichkeit mittelfristig rausfliegt. Da ist es besser, den gleich wegzulassen und zudem einen höheren Wert für cost zu benutzen. Der Vorgabewert von PHP ist 10, mit 8 bleibst du sogar darunter. Nicht gut.

Mit dem folgenden Code kannst du das Problem nachvollziehen.

<?php

ini_set('display_errors', 1);
error_reporting(E_ALL);

$password = 'foo';
// salt ist 3 Zeichen lang, Aufruf funktioniert nicht
#$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'bar', 'cost' => '8']);
// salt auto, Aufruf funktioniert
#$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => '12']);
// cost auto, salt auto, Aufruf funktioniert
#$hash = password_hash($password, PASSWORD_DEFAULT);
// cost ist auf 8 festgelegt, salt ist 24 Zeichen lang, Aufruf funktioniert
$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'barristaschießmichtot!!!', 'cost' => '8']);

$check = password_verify($password, $hash);

echo '<h2>Inhalt <code>$password</code></h2>';
var_dump($password);
echo '<h2>Inhalt <code>$hash</code></h2>';
var_dump($hash);
echo '<h2>Inhalt <code>$check</code></h2>';
var_dump($check);

?>

Tschö, Auge

--
Eine Kerze stand [auf dem Abort] bereit, und der Almanach des vergangenen Jahres hing an einer Schnur. Die Herausgeber kannten ihre Leser und druckten den Almanach auf weiches, dünnes Papier.
Kleine freie Männer von Terry Pratchett