Passwort-Hashing in PHP
- Passwort-Hashing in PHP
-
Verwenden Sie
password_hash()
undpassword_verify()
für Passwort-Hashing in PHP
PHP wird für die serverseitige Entwicklung verwendet, und Sie benötigen Passwörter, wenn Sie Anmelde- und Registrierungsprozesse erstellen. Aus Sicherheitsgründen und aus Datenschutzgründen müssen wir unsere Passwörter hashen, damit niemand (einschließlich Sie und Ihr Datenbankadministrator) das Passwort eines Benutzers kennen kann.
Wenn wir das Passwort jedoch hashen, müssen wir es erneut hashen, wenn wir die Person anmelden möchten. Dieser Artikel beschreibt, was Passwort-Hashing ist und wie die integrierten PHP-Funktionen password_hash()
und password_verify()
verwendet werden. .
Passwort-Hashing in PHP
Von Benutzern gesammelte Daten werden in Datenbanken gespeichert, die für jeden mit Zugriff auf die Datenbank sichtbar sind. Benutzernamen und Adressen werden oft so belassen, wie sie sind; Sie sind nicht so wichtig wie der Schlüssel zu Ihren Konten.
Die Textzeichenfolge, die das Passwort des Benutzers darstellt, wird durch Hashing-Algorithmen (bcrypt, md5, sha-1, sha-2) geleitet, um zu verhindern, dass die Passwörter unverändert gespeichert werden, und um eine verschlüsselte Darstellung des Textes zu erstellen. Diese verschlüsselte Darstellung des Passworts wird gespeichert, und während Login-Prozessen wird die verschlüsselte Darstellung verglichen.
Die eingebaute password_hash()
-Funktion nutzt den bcrypt-Algorithmus, den Auth0 empfiehlt und für seine Kundenbasis verwendet. Außerdem vergleicht die Funktion password_verify()
den Passworttext mit dem Hash und gibt einen booleschen Wert zurück, wenn das Passwort mit einem Hash übereinstimmt.
Verwenden Sie password_hash()
und password_verify()
für Passwort-Hashing in PHP
Wenn ein Benutzer auf Ihre Website kommt und ein neues Konto erstellt, stellen Sie als PHP-Entwickler sicher, dass Ihre Anwendung das Passwort hasht. Dazu wenden wir die Funktion password_hash()
an.
<?php
$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password
?>
Die Ausgabe des Codeschnipsels ist:
$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.
Das Code-Snippet verwendet den Standard-Hashing-Algorithmus, der laut PHP-Dokumentation den bcrypt-Algorithmus verwendet. Wenn wir beabsichtigen, den Hash-Algorithmus zu ändern, können wir das zweite Argument der Funktion ändern.
Es gibt drei weitere mögliche Argumente (Hashing-Algorithmus), die wir verwenden können. Die Argumente PASSWORD_BCRYPT
, PASSWORD_ARGON2I
und PASSWORD_ARGON2ID
werden unterstützt.
PASSWORD_BCRYPT
verwendet den CRYPT_BLOWFISH
-Algorithmus, PASSWORD_ARGON2I
verwendet den Argon2i
-Hashing-Algorithmus und PASSWORD_ARGON2ID
verwendet den Argon2id
-Hashing-Algorithmus. Um besser zu verstehen, wie jeder Algorithmus funktioniert, sehen Sie sich die PHP-Kennwort-Hash-Dokumentation an.
Probieren wir den Parameter PASSWORD_BCRYPT
in unserem Code aus.
<?php
$password = "24FE21121@1*?"; // password the user imputs.
echo password_hash($password, PASSWORD_DEFAULT); // outputs the hashed password
?>
Die Ausgabe des Codeschnipsels ist:
$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO
Sowohl PASSWORD_DEFAULT
als auch PASSWORD_BCRYPT
verwenden die Kennung $2y$
und erzeugen eine Zeichenfolge mit 60 Zeichen. Mit dem obigen Prozess haben wir das Passwort des Benutzers erfolgreich gehasht.
Wenn sich der Benutzer nun bei seinem Konto anmelden möchte, müssen wir das eingegebene Passwort mit dem gehashten Passwort vergleichen. Hier kommt password_verify()
ins Spiel.
Wir können das Passwort und das gespeicherte gehashte Passwort mit der eingebauten Funktion vergleichen.
<?php
$password = "24FE21121@1*?";
$hashed_password ='$2y$10$YRmyqWGiHbDSI31XbD2DuOzmTKSjYSSgR.2.3rYCmSSFS/xlAtb3.';
print_r(password_verify($password, $hashed_password));
?>
Die Ausgabe des Codeschnipsels ist:
1
In PHP steht 1 für true
und 0 für false
.
Lassen Sie uns die Funktion password_verify()
mit dem gehashten Passwort ausprobieren, das vom Parameter PASSWORD_BCRYPT
erzeugt wird.
<?php
$password = "24FE21121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';
print_r(password_verify($password, $hashed_password));
?>
Die Ausgabe des Codeschnipsels ist:
1
Der Grund, warum die Funktion password_verify()
unabhängig von dem von uns verwendeten gehashten Passwort funktionieren kann, liegt darin, dass die Funktion die angegebenen Hash-Übereinstimmungen überprüft, die mit crypt()
kompatibel sind, was beides ist. Außerdem geben die Funktionen den Algorithmus, die Kosten und das Salz als Teil des zurückgegebenen Hashs zurück und sind sicher gegen Timing-Angriffe.
Um Ihr Hash-Ergebnis zu verbessern, geben Sie die Kosten- und Salt-Optionen in der Funktion password_hash()
an. Wenn Sie jedoch nicht verstehen, wie man es benutzt, kann es Ihre Sicherheit stark beeinträchtigen.
Um zu prüfen, ob die Funktion password_verify()
ein falsches Passwort abfängt, geben wir ein falsches Passwort ein (ändern Sie von 24FE21121@1*?
zu 24Fqqw1121@1*?
).
<?php
$password = "24Fqqw1121@1*?";
$hashed_password = '$2y$10$vNfovWay8hSq5ixa/lOPK.4YMVX1kgYCBPDEdvz3zM/EBUiBUukpO';
if (password_verify($password, $hashed_password)) {
echo "Password Matches!";
} else {
echo "Wrong Password";
}
?>
Die Ausgabe des Codeschnipsels ist:
Wrong Password
Wenn wir es im Rahmen eines tatsächlichen Anmeldevorgangs verwenden, könnte der Code so aussehen:
<?php
$connect = mysqli_connect($localhost, $username, $password, $database);
if (isset($_POST['submit'])) {
extract($_POST);
// retrive stored hashed password
$sqlQuery = mysqli_query($connect, "SELECT * FROM USERTABLE WHERE USER='$username'");
$fetch = mysqli_fetch_array($sqlQuery);
$currentPassword = $fetch['hashPassword'];
if (password_verify($enteredPassword, $currentPassword)) {
// password matches
$_SESSION['id'] = $fetch['id'];
header("location: home.php");
} else {
// password doesn't match
$output = "Wrong Passworfd";
}
}
Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.
LinkedIn