Aktueller Standort: Startseite> Neueste Artikel> Der Unterschied und die Vorteile der Funktion von PHP Hash_equals und STRCMP

Der Unterschied und die Vorteile der Funktion von PHP Hash_equals und STRCMP

gitbox 2025-05-26

Wenn wir in PHP vergleichen müssen, ob zwei Zeichenfolgen gleich sind, ist die häufig verwendete Methode die STRCMP -Funktion. Mit der Erhöhung der Sicherheitsanforderungen führte PHP 5.6 jedoch eine Funktion Hash_equals speziell für den Sicherheitsvergleich ein. In diesem Artikel werden die Unterschiede zwischen diesen beiden Funktionen im Detail einführen und erklären, warum Hash_Equals in einigen Szenarien empfohlen werden.


1. Vergleich der grundlegenden Funktionen von STRCMP und Hash_Equals

  • STRCMP (String $ str1, String $ str2): int int
    STRCMP wird verwendet, um zwei Saiten in der Wörterbuchreihenfolge zu vergleichen. Es gibt einen Ganzzahlwert zurück:

    • 0 bedeutet, dass die beiden Saiten genau gleich sind

    • Negative Zahlen geben an, dass die erste Zeichenfolge kleiner als die zweite Zeichenfolge ist

    • Positive Zahl bedeutet, dass die erste Zeichenfolge größer ist als die zweite Zeichenfolge

  • Hash_equals (String $ bekannte_string, String $ user_string): bool
    Hash_equals wird speziell verwendet, um zu vergleichen, ob zwei Zeichenfolgen genau gleich sind, und der Vergleichsprozess ist ein sicherer Weg, um Timing -Angriffe zu verhindern. Es gibt einen Booleschen Wert zurück:

    • Wahre bedeutet, dass zwei Saiten genau gleich sind

    • Falsch bedeutet ungleich


2. Timing -Angriff und seine Risiken

In einigen Sicherheitsszenarien wie Überprüfung sensibler Daten wie Kennwort -Hash, API -Schlüssel, Signatur usw. Die gewöhnlichen String -Vergleichsfunktionen (z. B. STRCMP ) kehren sofort zurück, wenn das erste unterschiedliche Zeichen gefunden wird, was dazu führt, dass die Vergleichszeit mit der Teillänge der Zeichenfolge zusammenhängt, die anfällig für Leckinformationen ist.


3. Die Sicherheitsvorteile von Hash_Equals

Hash_equals wurde mit besonderer Überlegung ausgelegt, um Zeitangriffe zu verhindern. Die Vergleichszeit ändert sich nicht mit der Länge desselben Teils der beiden Zeichenfolgen, sondern fixiert stattdessen die Ausführungszeit, wodurch das Risiko von Ausgriffen Informationen verringert wird.


4. Vergleich der tatsächlichen Codebeispiele

 <?php
// verwenden strcmp Vergleich von zwei Saiten
$known = 'securetoken123';
$userInput = 'securetoken124';

if (strcmp($known, $userInput) === 0) {
    echo "Erfolgreich übereinstimmen(strcmp)";
} else {
    echo "Match fehlgeschlagen(strcmp)";
}
?>
 <?php
// verwenden hash_equals Vergleich von zwei Saiten
$known = 'securetoken123';
$userInput = 'securetoken124';

if (hash_equals($known, $userInput)) {
    echo "Erfolgreich übereinstimmen(hash_equals)";
} else {
    echo "Match fehlgeschlagen(hash_equals)";
}
?>

Beachten Sie, dass STRCMP im String -Vergleich im obigen Code sofort auf das erste verschiedene Zeichen zurückgibt und Hash_equals den vollständigen Vergleich durchführt.


5. Wann wird empfohlen, Hash_equals zu verwenden?

  • Überprüfen Sie das Kennwort Hash : Obwohl die meisten Kennwortüberprüfungen Password_verify übergeben, wird empfohlen, Hash_equals zu verwenden, wenn Sie Vergleichs -Hash selbst implementieren.

  • Vergleichen Sie verschlüsselte Signaturen : Zum Beispiel HMAC, JWT usw., um den Schlüssel zu vermeiden.

  • Vergleichende Sicherheitstoken : API -Schlüssel, Zugriffsstoken, Überprüfungscodes usw.

Einfach ausgedrückt wird empfohlen, Hash_equals für einen Sicherheits-String-Vergleich zu verwenden.


6. Vorsichtsmaßnahmen für die Verwendung

  • Hash_equals verlangt, dass die beiden in übergebenen Parameter Strings sind und die gleiche Länge haben, ansonsten wird falsch direkt zurückgegeben.

  • Bevor Sie Hash_equals verwenden, wird empfohlen, um sicherzustellen, dass die Eingangszeichenfolgen vom Saitentyp sind und die gleiche Länge haben, um unerwartete Fehler zu vermeiden.


Abschluss

Obwohl STRCMP eine häufig verwendete und leistungsstarke String -Vergleichsfunktion ist, ist Hash_equals bei sicheren und sensiblen Anlässen eine geeignetere Wahl, da es sich um die Verhinderung zeitgesteuerter Angriffe handelt. Die korrekte Verwendung von Hash_Equals kann die Sicherheit der Anwendung effektiv verbessern und potenzielle Angriffsrisiken vermeiden.