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.
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
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.
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.
<?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.
Ü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.
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.
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.