Passwort-Hashing in PHP

Olorunfemi Akinlua 30 Januar 2023
  1. Passwort-Hashing in PHP
  2. Verwenden Sie password_hash() und password_verify() für Passwort-Hashing in PHP
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 Akinlua avatar Olorunfemi Akinlua avatar

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

Verwandter Artikel - PHP Password