Aktueller Standort: Startseite> Neueste Artikel> Verwenden Sie die Funktion Hash_equals für sichere Benutzerauthentifizierung

Verwenden Sie die Funktion Hash_equals für sichere Benutzerauthentifizierung

gitbox 2025-05-29

In PHP ist die Benutzerauthentifizierung die grundlegende Verbindung beim Erstellen sicherer Anwendungen. Beim Vergleich von Kennwörtern oder Token können unsichere String -Vergleichsmethoden zu einem Zeitangriff führen, sodass der Angreifer vertrauliche Informationen schließen kann. PHP liefert eine Funktion hash_equals (), die speziell zur Verhinderung solcher Angriffe entwickelt wurde, die zwei Zeichenfolgen konstant vergleichen können, um die Sicherheit zu gewährleisten.

In diesem Artikel wird vorgestellt, wie die Funktion Hash_equals () verwendet wird, um einen sicheren Benutzerauthentifizierungsprozess zu implementieren, um gemeinsame Sicherheitsrisiken zu vermeiden.


1. Was ist ein Timing -Angriff?

Der Zeitangriff bezieht sich auf den Angreifer, das sensible Informationen wie Passwort -Hash oder Authentifizierungs -Token allmählich erraten, indem die Zeitunterschiede für verschiedene Eingabestaten durch Messung des Programms gemessen werden.

Herkömmliche String -Vergleichsfunktionen (z. B. == oder STRCMP ) kehren so früh wie möglich zurück, wenn die Übereinstimmung fehlschlägt, was zur Vergleichszeit führt, die von der Ähnlichkeit der Zeichenfolge abhängt und so die Informationen enthüllt.


2. Hash_equals () in PHP

Hash_equals () ist eine Funktion, die von PHP 5.6 und höher bereitgestellt wird. Es ist so konzipiert, dass es zwei Zeichenfolgen zu einem konstanten Zeitpunkt verglichen wird, um aufgrund von Unterschieden in der Rückkehrzeit Informationsleckage zu vermeiden.

Funktionsprototyp:

 bool hash_equals(string $known_string, string $user_string)
  • $ bekannte_string : eine bekannte Zeichenfolge (normalerweise ein gespeicherter Hash -Wert).

  • $ user_string : Die vom Benutzer eingegebene Zeichenfolge (Wert, der überprüft werden muss).

Return true , wenn zwei Zeichenfolgen gleich sind, ansonsten falsch zurückgeben.


3. Beispiel für die Verwendung von Hash_equals () zur Implementierung einer sicheren Authentifizierung

Nehmen wir an, dass wir, wenn der Benutzer registriert ist, das Kennwort mit einem Sicherheitsalgorithmus gehasst und gespeichert hat. Beim Anmelden müssen wir das vom Benutzer eingegebene Passwort überprüfen.

Beispielcode:

 <?php
// Bei Benutzerregistrierung,Speichern Sie Passwort Hash in der Datenbank
$password = 'user_password123';
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

// Wenn sich der Benutzer anmeldet,Passwort überprüfen
$input_password = $_POST['password'] ?? '';

// Passwort überprüfen
if (password_verify($input_password, $hashed_password)) {
    // Nehmen Sie die in der Datenbank gespeicherte Hash -Zeichenfolge heraus
    $stored_hash = $hashed_password;
    // Wiederholen Sie das Passwort des Benutzers zum Vergleich(Das Demonstrationsszenario hier sind Überprüfungs -Token und andere Situationen)
    $input_hash = hash('sha256', $input_password);

    // verwenden hash_equals Konstante Zeitvergleich
    if (hash_equals($stored_hash, $input_hash)) {
        echo "Erfolgreiche Zertifizierung";
    } else {
        echo "Authentifizierung fehlgeschlagen";
    }
} else {
    echo "Authentifizierung fehlgeschlagen";
}
?>

Hinweis : Im obigen Beispiel hat Password_verify () selbst den Kennwort -Hash sicher überprüft, und Hash_equals () ist für Szenarien geeignet, die API -Token oder benutzerdefinierte Hash -Werte überprüfen.


4. Sicherheitsbeispiele für die API -Token -Überprüfung

In vielen Szenarien müssen wir überprüfen, ob das vom Benutzer bestehende API -Token mit dem auf dem Server gespeicherten Token übereinstimmt. Wenn Sie == direkt verwenden, besteht das Risiko eines Zeitangriffs.

Beispiel:

 <?php
// Serverseitiger SpeicherAPIToken
$stored_token = 'abc123def456';

// 用户提交的Token
$provided_token = $_GET['token'] ?? '';

// Einen sicheren Vergleich machen
if (hash_equals($stored_token, $provided_token)) {
    echo "Token验证通过";
} else {
    echo "Token验证失败";
}
?>

Auf diese Weise kann der Angreifer auch wenn die Token nicht übereinstimmen, nicht durch Vergleich des zeitaufwändigen Prozesses das richtige Token schließen.


5. Zusammenfassung

  • Hash_equals () bietet einen konstanten Zeitzeichenvergleich, der Zeitangriffe verhindert.

  • Bei der Passwortüberprüfung wird empfohlen, password_hash () und passwart_verify () zu verwenden, und Hash_equals () ist für sichere Vergleiche von Token- oder Hash -Werten geeignet.

  • Durch rational unter Verwendung von Hash_equals () kann die Sicherheit des Authentifizierungsprozesses erheblich verbessert und das Risiko für sensible Informationsleckage verringert werden.


Wenn Sie mehr über Best Practices für PHP-Sicherheitszertifizierung erfahren möchten, können Sie https://gitbox.net/php-security besuchen.