passord_verify() hash
bearbeitet von AugeHallo
> zu `PASSWORD_DEFAULT` habe ich selbst `cost` und `salt` manuell angegeben z.B.:
>
> ~~~php
> $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.
~~~PHP
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
<?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 auto, 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
passord_verify() hash
bearbeitet von AugeHallo
> zu `PASSWORD_DEFAULT` habe ich selbst `cost` und `salt` manuell angegeben z.B.:
>
> ~~~php
> $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.
~~~PHP
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
<?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);
// 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
passord_verify() hash
bearbeitet von AugeHallo
> zu `PASSWORD_DEFAULT` habe ich selbst `cost` und `salt` manuell angegeben z.B.:
>
> ~~~php
> $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.
~~~PHP
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
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$password = 'foo';
#$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'bar', 'cost' => '8']); // salt ist 3 Zeichen lang, Aufruf funktioniert nicht
#$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => '12']); // salt auto, Aufruf funktioniert
#$hash = password_hash($password, PASSWORD_DEFAULT); // salt ist 3 Zeichen lang, Aufruf funktioniert nicht // cost auto, salt auto, Aufruf funktioniert
$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'barristaschießmichtot!!!', 'cost' => '8']); // salt ist 24 Zeichen lang, Aufruf funktioniert
$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
passord_verify() hash
bearbeitet von AugeHallo
> zu `PASSWORD_DEFAULT` habe ich selbst `cost` und `salt` manuell angegeben z.B.:
>
> ~~~php
> $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.
~~~PHP
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
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
$password = 'foo';
#$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'bar', 'cost' => '8']);
#$hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => '12']);
#$hash = password_hash($password, PASSWORD_DEFAULT);
$hash = password_hash($password, PASSWORD_DEFAULT, ['salt' => 'barristaschießmichtot!!!', 'cost' => '8']); // salt ist 24 Zeichen lang
$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