In PHP wird die Funktion password_needs_rehash verwendet, um festzustellen, ob ein Kennwort -Hash -Wert mit dem derzeit angegebenen Algorithmus und der Optionen neu aufgeweckt werden muss. Wenn sich die Hashing -Richtlinien des Systems ändert (z. B. das Upgrade von Bcrypt zu argon2ID oder Änderung des Kostenfaktors), kann es uns helfen, den alten Hash auf den neuen Standard zu aktualisieren, wenn sich der Benutzer anmeldet. Entwickler können jedoch auf Situationen stoßen, in denen "unproduktiv aussieht", wenn diese Funktion verwendet wird. Lassen Sie uns analysieren, warum password_needs_rehash möglicherweise nicht wirksam wird, und konzentrieren Sie sich darauf, den häufigsten Grund zu erklären: den Hash -Algorithmus -Einstellungsfehler.
$hash = password_hash('mypassword', PASSWORD_DEFAULT);
$options = ['cost' => 12];
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options)) {
$hash = password_hash('mypassword', PASSWORD_DEFAULT, $options);
}
Diese Logik bedeutet: Wenn der ursprüngliche Hash nicht dem aktuellen Algorithmus oder den Parametern entspricht, wird er wieder aufgeweckt.
Die Kernbasis von password_needs_rehash ist der Algorithmus und die Parameter, die Sie übergeben . Wenn Sie diese Parameter falsch festlegen, wird der Unterschied nicht beurteilt und fälschlicherweise falsch zurückgegeben, da kein Update erforderlich ist.
Viele Entwickler denken, dass PHP den Algorithmus für Sie automatisch aktualisiert, solange Sie Password_Default verwenden. Zum Beispiel:
$oldHash = password_hash('mypassword', PASSWORD_BCRYPT); // Nutzen Sie explizit bcrypt
Dann ändern Sie es in:
$options = ['cost' => 12];
$needsRehash = password_needs_rehash($oldHash, PASSWORD_DEFAULT, $options);
Das Problem ist: password_default ist derzeit (ab Php 8.3) immer noch password_bcrypt . Dann findet Passwort_Needs_Rehash den Algorithmus -Inkonsistenz nicht, da er glaubt, dass der Algorithmus immer noch bcrypt ist. Zu diesem Zeitpunkt können Sie erwarten, dass es wahr zurückgibt, aber es gibt falsch zurück.
Viele Menschen übergeben Kostenparameter (wie z. B. Kosten ), aber wenn im ursprünglichen Hash -Wert die gleichen Kosten bereits verwendet werden, wird die Funktion nicht als "Wiederholung erforderlich" beurteilt. Selbst wenn Sie manuell ['kostet' => 10] schreiben, und es ursprünglich 10 war, gibt die Funktion in diesem Fall falsch zurück.
$hash = password_hash('mypassword', PASSWORD_BCRYPT, ['cost' => 10]);
$needsRehash = password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 10]);
// Das Ergebnis ist immer noch false,Weil es keine Veränderung gibt
Um sicherzustellen, dass Ihre Hashing -Strategie bei Änderungen korrekt wahrgenommen wird, werden die folgenden Praktiken empfohlen:
Eindeutig neue Algorithmen einrichten (z. B. Upgrade von password_bcrypt zu password_argon2id );
Aktualisieren Sie die Kostenparameter explizit, z. B. die Erhöhung der Kosten von 10 bis 12;
Wenn möglich, führen Sie die ursprüngliche Hash -Richtlinie als Konfigurationselement für einheitliche Upgrades bei.
$hash = password_hash('mypassword', PASSWORD_ARGON2ID);
$needsRehash = password_needs_rehash($hash, PASSWORD_ARGON2ID, [
'memory_cost' => 1<<17,
'time_cost' => 4,
'threads' => 2
]);
Wenn Sie vermuten, dass password_needs_rehash nicht wie erwartet funktioniert, können Sie die Hash -Zeichenfolge während des Debuggens ausgeben, um es zu überprüfen. Hash -Präfixe repräsentieren normalerweise den verwendeten Algorithmus, zum Beispiel:
$ 2y $ bedeutet bcrypt
$ argon2id $ bedeutet argon2id
Sie können überprüfen, ob der neue Algorithmus tatsächlich durch Beobachten dieser Präfixe verwendet wird.
Darüber hinaus kann die aktuelle Konfiguration über die Protokollierung ausgegeben werden oder eine Hintergrundverwaltungsseite kann erstellt werden, um die derzeit verwendeten Hash -Richtlinie zu überprüfen.
password_needs_rehash ist eine sehr praktische Funktion, die uns helfen kann, die Hashing -Strategie des Übergangskennworts zu glätten, aber nicht "magisch". Es hängt von den Parametern ab, die Sie zur Beurteilung der Unterschiede angeben. Wenn es falsch eingerichtet ist, kann es darum gehen, dass kein Update erforderlich ist, auch wenn der Hash veraltet ist. Daher ist es der Schlüssel, die Wirksamkeit der Funktion zu gewährleisten, die Konfiguration der Hashing -Strategie klar und kontrollierbar.
Wenn Sie sicherstellen, dass Ihr Code korrekt bestimmt, wann Rehash erforderlich ist, ist der erste Schritt in der Entwicklung der Passwortsicherheit. Für Online -Projekte wird empfohlen, Hash -Richtlinien als zentralisiert zu konfigurieren und den Upgrade -Plan regelmäßig zu bewerten, um sicherzustellen, dass die Sicherheitsrichtlinien in der Vergangenheit nicht bleiben.