In PHP sind password_hash () und password_verify () Funktionen für die Kennwortverschlüsselung und -überprüfung. Ihre Kombination kann die Sicherheit des Kennwortspeichers effektiv verbessern und Kennwortleckage und Risse verhindern. Viele Entwickler haben jedoch immer noch Fragen zu den Verschlüsselungsalgorithmen, die sie verwenden, und deren Beziehungen. In diesem Artikel werden ihre Verschlüsselungsalgorithmen und die Beziehung zwischen ihnen untersucht.
Die Funktion password_hash () wurde in PHP 5.5 und oben eingeführt und wird verwendet, um das Klartextkennwort des Benutzers in ein verschlüsseltes Passwort umzuwandeln. Es verwendet moderne Hashing -Algorithmen (wie Bcrypt ) und kann automatisch ein "Salz" erzeugen. Salz sind zusätzliche zufällige Daten, mit denen sichergestellt wird, dass das gleiche Klartextkennwort bei jedem Verschlüsselung einen anderen Hash -Wert generiert.
Standardmäßig verwendet Password_hash () den Bcrypt -Algorithmus, und der von ihm generierte Hash -Wert enthält den Inhalt von Salz, sodass beim Speichern von Passwörtern kein zusätzliches Salz erforderlich ist. Der Bcrypt- Algorithmus selbst ist ebenfalls anpassungsfähig, dh er kann die Rechenintensität verbessern, indem er den Kostenfaktor erhöht, um Brute-Force-Risse zu widerstehen.
Beispielcode:
<span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">'my_secure_password'</span></span><span>;
</span><span><span class="hljs-variable">$hashedPassword</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-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$hashedPassword</span></span><span>;
</span></span>Die Funktion password_verify () wird verwendet, um zu überprüfen, ob das eingegebene Passwort mit dem gespeicherten Hash -Wert übereinstimmt. Seine Funktion besteht darin, das vom Benutzer eingegebene Klartextkennwort mit dem in der Datenbank gespeicherten verschlüsselten Passwort zu vergleichen, wenn sich der Benutzer anmeldet. Password_verify () extrahiert das Salz automatisch im gespeicherten Hash -Wert und verwendet denselben Algorithmus, um das vom Benutzer eingegebene Kennwort zu verschlüsseln, und vergleichen Sie ihn dann mit dem gespeicherten Hash -Wert.
Es ist zu beachten, dass Password_verify () basierend auf dem im Hash -Wert angegebenen Algorithmus berechnet wird. Daher müssen Entwickler nicht manuell Salz- oder Verschlüsselungsalgorithmus für password_verify () übergeben, was automatisch die geeignete Möglichkeit auswählt, basierend auf dem eingehenden Hash -Wert zu überprüfen.
Beispielcode:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-variable">$userInputPassword</span></span><span>, </span><span><span class="hljs-variable">$storedHash</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Password is correct!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Invalid password!"</span></span><span>;
}
</span></span>Die Beziehung zwischen password_hash () und password_verify () besteht darin, dass sie denselben Verschlüsselungsalgorithmus zur Verarbeitung und Überprüfung der Kennwort verwenden. Speziell:
Kennwortverschlüsselung: password_hash () konvertiert das Klartextkennwort in den verschlüsselten Hash -Wert gemäß dem angegebenen Algorithmus (standardmäßig BCrypt ). Der Hash -Wert enthält Salz und andere Parameter des Algorithmus (wie Arbeitsfaktoren).
Kennwortüberprüfung: Password_verify () verwendet denselben Algorithmus (z. B. Bcrypt ), um das vom Benutzer eingegebene Kennwort zu verschlüsseln, indem die Algorithmusinformationen und das Salz im Hash -Wert gelesen werden, und vergleicht es dann mit dem gespeicherten Hash -Wert.
Daher muss password_verify () mit dem gleichen Algorithmus und Parametern wie password_hash () überprüft werden. Wenn der Hash -Wert BCRYPT verwendet, verwendet password_verify () auch automatisch BCrypt zur Überprüfung.
Obwohl password_hash () standardmäßig BCrypt ist, unterstützt es auch andere Algorithmen. Nach PHP 7.2 unterstützt Passage_hash () auch zwei weitere leistungsstarke Algorithmen, Argon2i und Argon2ID . Argon2 ist ein moderner Hashing -Algorithmus, der eine bessere Fähigkeit bietet, GPU -Power -Cracking zu verhindern als Bcrypt .
Beispielcode mit Argon2i :
<span><span><span class="hljs-variable">$hashedPassword</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_ARGON2I);
</span></span>Wenn das Kennwort mit dem Argon2 -Algorithmus verschlüsselt wird, identifiziert und verwenden Sie den entsprechenden Algorithmus zur Überprüfung automatisch und verwenden automatisch.
password_hash () und password_verify () sind zwei sehr wichtige Funktionen in PHP für die Kennwortverschlüsselung und -überprüfung. Ihre Verschlüsselungsalgorithmen sind eng verwandt, password_hash () wird verwendet, um Hash -Werte zu verschlüsseln und zu generieren, während password_verify () die Korrektheit des Kennworts basierend auf den Hash -Werten überprüfen wird. Beide werden normalerweise zusammen verwendet, um die Sicherheit des Kennwortspeichers zu gewährleisten. Obwohl der Bcrypt -Algorithmus standardmäßig verwendet wird, unterstützt PHP auch stärkere Algorithmen wie Argon2 , die bei Bedarf ausgewählt werden können.
Durch das Verständnis der Verschlüsselungsalgorithmus -Beziehung, die von password_hash () und passwart_verify () verwendet wird, können Entwickler sichere Kennwortspeicher- und Überprüfungsmechanismen zur Verbesserung der Anwendungssicherheit entwerfen.