Was passieren würde ist, dass neu gehashten Passwörter den neuen Algorithmus verwenden - offensichtlich.
Sie sollten sich jedoch keine Gedanken darüber machen, denn das Ganze ist auf Vorwärtskompatibilität ausgelegt - Ihr Code wird nicht beschädigt, wenn sich der Standardalgorithmus ändert, solange Sie die password_*()
verwenden funktioniert richtig.
Mit richtig meine ich Verwendung password_verify()
.
password_verify()
akzeptiert ein Klartext-Passwort und einen Hash, und es kann leicht feststellen, was der verwendete Algorithmus ist, indem er sich den Hash anschaut, den Sie ihm zuführen. Daher wäre es auch in der Lage, ein Passwort zu verifizieren, das mit einem alten Algorithmus gehasht wurde - nicht nur das vorherige, sondern jeder Algorithmus, der unterstützt wird.
In der Tat ist der einzige Zweck der Konstante PASSWORD_DEFAULT
, dass Sie ältere Hashes leicht zu einem neuen Algorithmus migrieren können (sobald einer hinzugefügt wird). Dies geschieht auf folgende Weise:
- Wenn sich ein Benutzer anmeldet, können Sie ihr Passwort über
password_verify()
(alle Hashing-Algorithmus, der eine PASSWORD_<name>
Konstante hat funktioniert) überprüfen.
- Sie rufen
password_needs_rehash()
, und wenn das Passwort, das Sie gerade verifiziert haben, einen älteren Algorithmus (oder eine niedrigere 'Kosten' parameter) verwendet - wird es Boolean TRUE zurückgeben.
- Wenn boolesche TRUE tatsächlich zurückgegeben wurde, können Sie den alten Hash durch einen ersetzen, der den neuen Algorithmus verwendet; Sie können dies während einer Anmeldung tun, weil der Benutzer Ihnen gerade das Passwort und gab Sie überprüft, dass es korrekt ist.
Zusammenfassend - es ist wirklich ein, wirklich gut gestaltete API und sie löst Probleme für Sie, dass Sie nicht einmal darüber nachgedacht haben. Mach dir keine Sorgen darüber.
Edit (in den Kommentaren angegeben):
Es sollte jedoch beachtet werden, dass neue Algorithmen ganz probly in längeren Hash-Längen zur Folge, so dass, wenn Sie die Passwörter in einer Datenbank gespeichert sind - nicht Begrenzen Sie die Feldlänge (dh verwenden Sie ein Feld varchar(255)
).
Danke. Das war hilfreich. – Ambitions
Gern geschehen.: :) – Narf
Es gibt einen wirklich wichtigen Unterschied, der dazu führen könnte, dass einige neue Hashes nicht validiert werden können. Da wir nicht wissen, welche Algorithmen in Zukunft verwendet werden, könnte dies bedeuten, dass sich die Hash-Länge ändern könnte. Aus diesem Grund empfiehlt das Handbuch, 'VARCHAR (255)' zu verwenden, um die Hashes zu speichern, obwohl die maximale Länge der bcrypt-Hashes ~ 55 Zeichen beträgt. – Mike