Die Funktion password_needs_rehash wird verwendet, um zu prüfen, ob der Hash -Wert eines vorhandenen Kennworts mit neuen Algorithmen oder Verschlüsselungsparametern aktualisiert werden muss. Es vergleicht den Hash des aktuellen Kennworts mit den angegebenen Verschlüsselungsparametern (wie Algorithmen, Kostenfaktoren usw.). Wenn der vorhandene Passwort -Hash nicht den neuen Anforderungen entspricht, gibt es true zurück, andernfalls wird falsch zurückgegeben.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hashedPassword</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>])) {
</span><span><span class="hljs-variable">$newHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>]);
</span><span><span class="hljs-comment">// Aktualisieren Sie das Passwort in der Datenbank</span></span><span>
}
</span></span>In diesem Beispiel prüft Password_needs_Rehash , ob $ HashedPassword die angegebenen Verschlüsselungsparameter (z. B. Kostenparameter ) erfüllt. Wenn es sich nicht erfüllt, muss das Passwort erneut verhandelt werden.
Mit der kontinuierlichen Aktualisierung und dem Upgrade von Kennworthashing -Algorithmen können Passwörter mit älteren Algorithmen möglicherweise Sicherheitsrisiken ausgesetzt sein. Zum Beispiel wurde PHP zunächst unter Verwendung von Algorithmen wie MD5 und SHA-1 verschlüsselt, aber diese Algorithmen haben sich als anfällig erwiesen. Mit dem Aufkommen moderner Verschlüsselungsalgorithmen wie Bcrypt und Argon2 sind die mit diesen Algorithmen verschlüsselten Passwörter sicherer.
Die Einführung der Funktion password_needs_rehash ermöglicht es Entwicklern, beim Speichern flexible Passwörter flexibel zu aktualisieren. Wenn wir uns beispielsweise entscheiden, BCrypt durch Argon2 zu ersetzen, kann das mit BCrypt vergrößerte Passwort über password_needs_rehash auf eine neue Verschlüsselungsmethode erkannt und aktualisiert werden. Auf diese Weise können sogar die in der Datenbank gespeicherten Passwörter automatisch auf den neuen Verschlüsselungsalgorithmus migriert werden, wenn sich der Benutzer beim nächsten Anmeldung einmeldet.
Die Sicherheit des Verschlüsselungsalgorithmus selbst hängt nicht nur von dem Algorithmus selbst ab, sondern auch von den Parametereinstellungen des Algorithmus (z. B. Kostenparameter in Bcrypt). Der Kostenparameter bestimmt die zeitliche Komplexität von Hash -Berechnungen. Höhere Werte können höhere Sicherheit liefern, können aber auch zu längeren Berechnungszeiten führen.
Angenommen, Sie haben zunächst den Bcrypt -Algorithmus mit Kosten 10 verwendet, um Passwörter zu speichern. Im Laufe der Zeit haben Sie jedoch fest, dass der Server über eine stärkere Verarbeitungsleistung verfügt und höhere Kostenwerte verwenden kann, um die Sicherheit zu verbessern. Mit Password_Needs_Rehash können Sie überprüfen, ob das in der Datenbank gespeicherte alte Passwort niedrigere Kosten verwendet und nach Bedarf aktualisieren.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hashedPassword</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">14</span></span><span>])) {
</span><span><span class="hljs-variable">$newHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">14</span></span><span>]);
</span><span><span class="hljs-comment">// Aktualisieren Sie das Passwort in der Datenbank</span></span><span>
}
</span></span>In diesem Beispiel sind die Kosten für den ursprünglichen Hash weniger als 14 betragen, eine erneute Einklyption.
Obwohl Password_Needs_Rehash eine einfache Möglichkeit bietet, festzustellen, ob ein Hash aktualisiert werden muss, hat dieser Vorgang möglicherweise noch einige Auswirkungen auf die Leistung. Insbesondere wenn große Benutzer oder häufige Datenbankzugriffs vorhanden sind, kann die Hash -Überprüfung jedes Mal, wenn sich der Benutzer anmeldet, die Belastung des Servers erhöhen.
Um die Leistungsauswirkungen zu verringern, wird empfohlen, die Kennwort-Neueinschlüsselung im Hintergrund asynchron zu verarbeiten, wenn die Kennwortanmeldung erfolgreich ist. Dies bedeutet, dass die Wiedereinstellung der Kennwortverschlüsse nicht die sofortige Erfahrung des Benutzers beeinflusst, sondern den Kennwort-Hash in der Datenbank im Hintergrund schrittweise aktualisiert.
Durch regelmäßige Überprüfung, ob das Hash des Passworts aktuelle Sicherheitsstandards erfüllt, kann die Verwendung von Password_Needs_Rehash die Sicherheit des Systems erheblich verbessern. Wenn kein Update durchgeführt wird, können die folgenden Risiken auftreten:
Sicherheitsprobleme mit alten Algorithmen : Ältere Verschlüsselungsalgorithmen wie MD5 und SHA1 sind nicht mehr sicher, und Angreifer können diese Passwörter leicht über Regenbogentabellen oder andere Methoden knacken.
Unsachgemäße Parametereinstellung : Wenn die Kosten zu niedrig eingestellt sind, ist das Kennwort möglicherweise anfällig für Brute-Force-Angriffe. Der Angreifer knackt den Hash, indem er mit einer großen Anzahl möglicher Passwortkombinationen experimentiert.
Durch regelmäßiges Erkennen und Aktualisieren von Kennworthashes wird sichergestellt, dass die Kennwortspeicherung immer den aktuellen besten Sicherheitsverfahren entspricht.