2017-09-03 3 views
0

Insbesondere bei Verwendung des PASSWORD_DEFAULT Algorithmus, gemäß den php pageIst PHP password_hash() rückwärtskompatibel?

„Beachten Sie, dass diese Konstante ausgelegt ist, als neue und stärkere Algorithmen im Laufe der Zeit zu ändern, um PHP hinzugefügt werden. Aus diesem Grunde wird die Länge des Ergebnisses aus der Verwendung Dieser Bezeichner kann sich im Laufe der Zeit ändern. Daher wird empfohlen, das Ergebnis in einer Datenbankspalte zu speichern, die mehr als 60 Zeichen umfassen kann (255 Zeichen wären eine gute Wahl). "

und

„Hinweis: Updates zu unterstützten Algorithmen von dieser Funktion (oder Änderungen an der Standard eins) müssen die folgenden Regeln beachten: Jeder neue Algorithmus für mindestens 1 Vollversion von PHP in Kern sein muss vor Wenn also beispielsweise ein neuer Algorithmus in 7.5.5 hinzugefügt wird, wäre er erst ab 7.7 (da 7.6 die erste vollständige Version), aber in 7.6 wurde ein anderer Algorithmus hinzugefügt. 0, wäre es auch für den Standard bei 7.7.0 geeignet Der Standardwert sollte nur in einer vollständigen Version (7.3.0, 8.0.0, etc) und nicht in einer Revision Release ändern .. Die einzige Ausnahme ist in einem Notfall, wenn ein kritischer Sicherheitsfehler im aktuellen Standard gefunden wird. "

Wenn PHP auf eine Version aktualisiert wird, die einen anderen Algorithmus für PASSWORD_DEFAULT verwendet, verhindert das, dass Benutzer sich anmelden, wenn ihre Kennwörter mit dem alten Algorithmus hashed wurden?

+1

Siehe die Dokumentation für 'password_verify' – PeeHaa

+0

Danke. "Beachten Sie, dass password_hash() den Algorithmus, Kosten und Salt als Teil des zurückgegebenen Hash zurückgibt. Daher sind alle Informationen, die zur Überprüfung des Hash benötigt werden, enthalten. Dies ermöglicht der Verify-Funktion, den Hash zu überprüfen, ohne separaten Speicher für die Salz- oder Algorithmusinformationen. " – GregCatalano

Antwort

1

Die kurze Antwort ja ist, wird es rückwärts kompatibel, ermöglicht längere Passwort-Hash-Längen Ihre Speicherbereitstellt.

Wenn Sie ein Passwort generieren, erhalten Sie es in einem bestimmten Format.

Ich habe zwei Passwörter mit bcrypt und die neuere argon2i Hash erzeugt. (Coming in PHP 7.2 mit der Einführung von libsodium)

Zur Info: Mein Code hier basiert auf der libsodium Erweiterung da ich nicht php bekam 7.2 heruntergeladen hat, und wurde nicht sodium_compat nur für die Aliase gehen zu installieren. Die PHP 7.2-Syntax enthält keine Namespaces.

$bcrypt = password_hash('insecurepassword', PASSWORD_BCRYPT); 
$argon2i = \Sodium\crypto_pwhash_str('insecurepassword', \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE); 

var_dump($bcrypt, $argon2i); 

Der Ausgang habe ich, wenn ich das lief war dieses

string(60) "$2y$10$jiT0NF3u426kguHes8ZBputRE/n9OSdPi5HhHvEWW4mX1XDwKwy1e" 
string(96) "$argon2i$v=19$m=32768,t=4,p=1$Ho4Vzgp5nzQkLlp99P+ViA$bDqX8UUlSnfLRCfFBzBnFhWr/hzHzuuUCfZ0LSIns64" 

Beide Passwörter in das gleiche Format mehr oder weniger sind. Wenn Sie die $ explodieren, enden Sie mit jedem Teil des Puzzles, das erforderlich ist, um das Passwort zu überprüfen.

Der erste Abschnitt enthält den Algorithmus. 2y für bcrypt, argon2i für ... Argon2i. (Überraschung!)

Die nächsten Bits enthalten die Konfigurationsoptionen, so in bcrypt Fall die Kosten. In argon2i Fall gibt es einige zusätzliche Konfiguration.

Der letzte Abschnitt enthält das tatsächliche Kennwort und den Salzwert für den zu überprüfenden Algorithmus.

Für ein bisschen mehr von einem visuellen Zusammenbruch Kasse php docs.

Obwohl ich einige verschiedene Funktionen verwendet, um einige Ausgaben zu demontieren, gibt es eine rfc, die akzeptiert wurde, dass die Unterstützung für die argon2i Hash-Funktion in die password_hash Funktionen in 7.2 eingeführt.

Also wenn diese Zeit kommt, password_verify wird "nur funktionieren" unabhängig davon, ob Sie es geben bcrypt oder argon2i Hash, um ein Passwort gegen zu überprüfen.

+0

Super Antwort, danke. Ich wusste nicht, dass der Algorithmus im Hash gespeichert wurde. – GregCatalano

1

Ist ein Einweg-Hashalgorithmus, können Sie keine Hashes entschlüsseln.

Verwenden password_verify zu überprüfen, wenn das Passwort den gespeicherten Hash übereinstimmt:

<?php 
    $hash = 'your-hash'; 

    if (password_verify('pass', $hash)) { 
    echo 'Password is valid'; 
    } else { 
    echo 'Password is not valid!'; 
    } 
Verwandte Themen