Hash -Funktionen sind ein sehr häufiges Werkzeug bei der Durchführung von Datenintegritätsüberprüfung oder Kennwortüberprüfung. Wenn Sie jedoch die Hash -Vergleiche (z. B. == oder === ) verwenden, verhindern und erfassen Sie jedoch potenzielle Hash -Konflikte nicht und erkennen Sie effektiv. Um die Sicherheit zu verbessern, bietet PHP zwei Funktionen: Hash_Final und Hash_Equals , die den Entwicklern helfen, die Hash -Operationen sicherer zu behandeln.
In diesem Artikel wird die Verwendung dieser beiden Funktionen eingeführt und ein praktisches Beispiel verwendet, um zu demonstrieren, wie sie verwendet werden, um die Hash -Kollisionserkennung zu erzielen.
Hash_Final ist der letzte Schritt beim Erstellen schrittweise Hash-Berechnungen mit Hash_init und Hash_Update . Es gibt den endgültigen Hash -Wert zurück.
Beispiel:
<?php
$context = hash_init('sha256');
hash_update($context, 'hello');
$hash = hash_final($context);
echo $hash;
Hier initialisieren wir einen Hash-Kontext von SHA-256 mit Hash_Init und verwenden dann Hash_Update , um die Daten als Hash hinzuzufügen, und verwenden schließlich Hash_Final , um das endgültige Hash-Ergebnis zu erhalten.
Hash_Equals wird verwendet, um zwei Hash -Werte sicher zu vergleichen. Im Gegensatz zur direkten Verwendung von == direkt kann es verhindern, dass Timing -Angriffe durch String -Vergleichsausgang frühzeitig verursacht werden. Timing -Angriff ist eine Angriffsmethode, die sensible Informationen angibt, indem die für einen Betrieb erforderliche Zeit gemessen wird.
Beispiel:
<?php
$knownHash = hash('sha256', 'known_value');
$userInputHash = hash('sha256', $_POST['input']);
if (hash_equals($knownHash, $userInputHash)) {
echo 'Erfolgreich übereinstimmen!';
} else {
echo 'Match fehlgeschlagen。';
}
Auch wenn der vom Benutzer eingegebene Wert nur ein Teil des richtigen Wertes ist, werden Hash_equals vollständig verglichen, um zu vermeiden, dass der Zeitunterschied während des Vergleichsprozesses ausgetragen wird.
Angenommen, wir müssen feststellen, ob die vom Benutzer eingereichten Daten mit den vorhandenen Daten auf dem Hash (d. H. Unterschiedliche Daten den gleichen Hash -Wert erzeugen). Wir können das tun:
Verwenden Sie Hash_init , Hash_Update und Hash_Final , um den Hash der vorhandenen Daten zu berechnen.
Berechnen Sie den Hash von Benutzerdaten auf die gleiche Weise.
Verwenden Sie Hash_equals, um zwei Hash -Werte zu vergleichen.
Beispielcode:
<?php
// Simulieren Sie vorhandene Daten
$existingData = 'Original content';
$context1 = hash_init('sha256');
hash_update($context1, $existingData);
$existingHash = hash_final($context1);
// Benutzernde Daten
$userData = $_POST['user_data'];
$context2 = hash_init('sha256');
hash_update($context2, $userData);
$userHash = hash_final($context2);
// Vergleichen Sie die Hash -Werte
if (hash_equals($existingHash, $userHash)) {
echo 'Hash -Konflikt erkannt!Die Daten können gleich sein oder den gleichen Hash -Wert erzeugen。';
} else {
echo '未Hash -Konflikt erkannt。';
}
Beachten:
Obwohl der gleiche Hash -Wert erfasst wird, weil die Daten gleich sind, kann dies auch theoretisch auf seltene Hash -Kollisionen zurückzuführen sein. Daher ist diese Erkennungsmethode eher zur Verteidigung oder Überprüfung geeignet, als sich vollständig auf Hash zu verlassen, um die Datenkonsistenz zu beurteilen.
Mit Hash_Final und Hash_Equals können wir nicht nur Hashes sicher berechnen und vergleichen, sondern auch Zeitpunktangriffe verhindern und potenzielle Hash -Konflikte in gewissem Maße erkennen. In Szenarien mit Sicherheit wird empfohlen, diese Tools anstelle einfacher String -Vergleiche zu verwenden.
In praktischen Anwendungen zum Beispiel:
Überprüfen Sie die Integrität von hochgeladenen Dateien
Überprüfen Sie das Passwort (verwenden Sie mit Password_hash und Passage_verify )
Erkennen Sie die Signatur des Schnittstellenaufrufs
Diese Funktionen können alle zur Verbesserung der Sicherheit verwendet werden.
Wenn Sie mehr wissen möchten, wird empfohlen, die offizielle PHP -Dokumentation zu überprüfen.