In vielen Anwendungen ist es sehr wichtig, die Integrität der Datei zu überprüfen. Insbesondere wenn Sie eine Datei herunterladen oder hochladen müssen, ist es sehr wichtig, sicherzustellen, dass die Datei nicht manipuliert oder beschädigt ist. PHP bietet eine Vielzahl von Methoden zur Durchführung von Hash -Überprüfungen von Dateien, bei denen Hash_Update_Stream und Hash_equals () zwei häufig verwendete Funktionen sind.
In diesem Artikel wird vorgestellt, wie die Funktion von Hash_Update_Stream verwendet wird, um die Datei schrittweise zu lesen und den Hash -Wert zu berechnen und dann die Funktion von Hash_equals () zu verwenden, um den berechneten Hash -Wert mit dem erwarteten Hash -Wert zu vergleichen, um die Integrität der Datei zu überprüfen.
Hash_Update_Stream : Diese Funktion wird verwendet, um den Hash -Wert des Datenstroms zu berechnen. Bei der Verarbeitung großer Dateien kann das Problem des Speicherüberlaufs effektiv vermieden werden, indem die Dateien in Stücken gelesen und den Hash -Wert allmählich aktualisiert werden.
Hash_Equals : Dies ist eine sichere Funktion zum Vergleich von zwei Hash -Werten. Es verhindert Timing -Angriffe und ist sicherer als die Verwendung von == oder == direkt, da es keine Zeitdifferenz aufgrund unterschiedlicher Längen der Hash -Werte aufdeckt.
Angenommen, Sie haben bereits eine Datei und einen erwarteten Hash -Wert, möchten die Integrität der Datei überprüfen, indem Sie die folgenden Schritte befolgen.
Zunächst müssen wir die zu überprüfende Datei öffnen. Wir können fopen () verwenden, um die Datei zum Lesen zu öffnen.
$file = fopen('path/to/your/file', 'rb');
Verwenden Sie dann Hash_init () , um einen Hash -Kontext zu initialisieren. Nehmen Sie hier als Beispiel SHA256 . Natürlich können Sie auch andere Hashing -Algorithmen (wie MD5 , SHA512 usw.) verwenden.
$hashContext = hash_init('sha256');
Wir lesen die Datei in Teilen und aktualisieren die Daten jedes Blocks über die Funktion von Hash_Update_Stream () in den Hash -Kontext.
while (!feof($file)) {
$data = fread($file, 8192); // Lesen8KBDatenblöcke
hash_update_stream($hashContext, $data);
}
Verwenden Sie nach dem Lesen der Datei Hash_Final () , um den berechneten Dateihash -Wert zu erhalten.
$fileHash = hash_final($hashContext);
Schließlich verwenden wir Hash_equals () , um den berechneten Datei -Hash -Wert sicher mit dem erwarteten Hash -Wert zu vergleichen, um sicherzustellen, dass die Datei nicht manipuliert wurde.
$expectedHash = 'Erwarteter Hash -Wert'; // Sie können diesen Hash -Wert von einem Server oder einem anderen sicheren Ort erhalten
if (hash_equals($fileHash, $expectedHash)) {
echo "Datei vollständig,Hash -Wert -Matching!";
} else {
echo "Dateien sind beschädigt oder manipuliert,Hash -Werte stimmen nicht überein!";
}
Hier ist der vollständige Beispielcode:
<?php
// Öffnen Sie die Datei
$file = fopen('path/to/your/file', 'rb');
if (!$file) {
die('无法Öffnen Sie die Datei');
}
// Initialisieren Sie den Hash -Kontext
$hashContext = hash_init('sha256');
// 逐步Lesen文件并更新哈希值
while (!feof($file)) {
$data = fread($file, 8192);
hash_update_stream($hashContext, $data);
}
// Holen Sie sich den Hash -Wert der Datei
$fileHash = hash_final($hashContext);
// Erwarteter Hash -Wert
$expectedHash = 'Erwarteter Hash -Wert'; // Zum Beispiel,'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'
// Vergleichen Sie die Hash -Werte
if (hash_equals($fileHash, $expectedHash)) {
echo "Datei vollständig,Hash -Wert -Matching!";
} else {
echo "Dateien sind beschädigt oder manipuliert,Hash -Werte stimmen nicht überein!";
}
// Schließen Sie die Datei
fclose($file);
?>