In PHP können wir den Hash -Wert einer großen Datei über Hash_Update_Stream berechnen, um die Integrität der Datei zu gewährleisten. In Kombination mit der Datenbankdatendatei -Hashing können Sie den Hash -Wert der Datei schnell vergleichen, wenn die anschließende Überprüfung der Integrität der Datei sichergestellt wird, dass die Datei nicht manipuliert wurde. In diesem Artikel wird ausführlich erläutert, wie dieser Prozess implementiert wird.
Die Funktion Hash_Update_Stream wird verwendet, um die Hash -Werte aus einem Dateistrom zu berechnen. Im Vergleich zur Methode zum Laden von Dateien in Speicher kann die Verwendung der Streaming -Verarbeitung effektiv Speicher sparen, was besonders für die Verarbeitung großer Dateien geeignet ist.
bool hash_update_stream ( resource $context , resource $handle [, int $length ] )
$ context : Hash -Kontext von Hash_init () initialisiert.
$ Handle : Eine gültige Dateihandle.
$ Länge (optional): Die Anzahl der Bytes, die gleichzeitig gelesen wurden, beträgt der Standard 8192 Bytes.
Diese Funktion wird normalerweise mit Hash_init () und Hash_Final () verwendet, mit dem der endgültige berechnete Hash -Wert zurückgegeben wird.
Durch die Verwendung von Hash_Update_Stream können wir die Hash -Berechnungsergebnisse der Datei in die Datenbank streamen. Bei Überprüfung müssen wir den Hash -Wert der Datei nur neu berechnen und mit den in der Datenbank gespeicherten Werten vergleichen, um die Überprüfung der Dateiintegrität zu erreichen.
Hier sind die kurzen Schritte für den gesamten Prozess:
Beim Hochladen einer Datei wird der Hash -Wert der Datei in der Datenbank berechnet und gespeichert.
Bei der Überprüfung der Datei wird der Hash aus der Datenbank gelesen und mit dem neu berechneten Hash verglichen.
Wenn die beiden übereinstimmen, bedeutet dies, dass die Datei nicht manipuliert wurde; Andernfalls wird die Integrität der Datei in Frage gestellt.
Entwerfen Sie zunächst eine einfache Datenbanktabelle, um Dateiinformationen und ihre Hash -Werte aufzuzeichnen. Wir gehen davon aus, dass in der Datenbank bereits eine Dateientabelle mit der Struktur wie folgt vorhanden ist:
CREATE TABLE `files` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`filename` VARCHAR(255) NOT NULL,
`hash` CHAR(64) NOT NULL,
`uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Dateiname speichert den Dateinamen, Hash speichert den Hash -Wert der Datei, Uploaded_at , die Upload -Zeit aufgezeichnet.
Wenn ein Benutzer eine Datei hochlädt, übergeben wir den Dateistrom an Hash_Update_Stream, um den Hash -Wert der Datei zu berechnen und den Dateinamen und seinen Hash -Wert in die Datenbank zu speichern.
<?php
// Nehmen Sie die Datei -Upload -Verarbeitung an
if (isset($_FILES['file'])) {
// Erhalten Sie Informationen zum Hochladen von Dateien
$fileTmpPath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
// Initialisieren Sie die Hash -Berechnung
$hashContext = hash_init('sha256');
// Öffnen Sie den Dateistrom
$fileHandle = fopen($fileTmpPath, 'rb');
// Berechnen Sie den Haschwert
while (!feof($fileHandle)) {
// Aktualisieren Sie Hash
hash_update_stream($hashContext, $fileHandle);
}
// Holen Sie sich den endgültigen Hash -Wert
$fileHash = hash_final($hashContext);
// Speichern Sie den Hash -Wert in die Datenbank
$db = new mysqli('localhost', 'root', '', 'file_db');
$stmt = $db->prepare("INSERT INTO files (filename, hash) VALUES (?, ?)");
$stmt->bind_param("ss", $fileName, $fileHash);
$stmt->execute();
// Schließen Sie den Dateihandle
fclose($fileHandle);
}
?>
In diesem Beispiel verwenden wir Hash_init () , um einen Hash-Kontext von SHA-256 zu initialisieren und dann Hash_Update_Stream () zu berechnen, um den Hash-Wert der hochgeladenen Datei zu berechnen und schließlich Hash_Final () zu verwenden, um den Hash-Wert zu erhalten und in der Datenbank zu speichern.
Im nachfolgenden Überprüfungsprozess können wir den entsprechenden Hash -Wert aus der Datenbank gemäß dem Dateinamen erhalten und ihn mit dem Hash -Wert der aktuellen Datei vergleichen.
<?php
// Nehmen Sie die Verarbeitungsverarbeitung von Dateien an
$fileNameToVerify = 'example_file.txt'; // Angenommen, der Dateiname muss überprüft werden
$filePath = '/path/to/files/' . $fileNameToVerify;
// Holen Sie sich den Hash -Wert in der Datenbank
$db = new mysqli('localhost', 'root', '', 'file_db');
$stmt = $db->prepare("SELECT hash FROM files WHERE filename = ?");
$stmt->bind_param("s", $fileNameToVerify);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$storedHash = $row['hash'];
// Berechnen Sie den Hash -Wert der aktuellen Datei
$hashContext = hash_init('sha256');
$fileHandle = fopen($filePath, 'rb');
while (!feof($fileHandle)) {
hash_update_stream($hashContext, $fileHandle);
}
$currentHash = hash_final($hashContext);
fclose($fileHandle);
// Vergleich des Hash -Werte in der Datenbank mit den aktuell berechneten Hash -Werten
if ($currentHash === $storedHash) {
echo "Überprüfung der Dateiintegrität bestanden!";
} else {
echo "Überprüfung der Dateiintegrität fehlgeschlagen!";
}
?>
Während der Überprüfung erhalten wir zunächst den Hash -Wert der Datei aus der Datenbank, dann den Hash -Wert der Datei neu und vergleichen schließlich. Wenn die beiden Hashes gleich sind, bedeutet dies, dass die Datei nicht geändert wurde. Wenn es inkonsistent ist, wurde die Datei möglicherweise manipuliert.
Durch Kombination von Hash_Update_Stream- und Datenbank -Protokollierungsdatei -Hash -Werten können wir die Dateiintegrität effizient überprüfen. Unabhängig davon, ob das Hochladen von Dateien oder eine anschließende Überprüfung, Streaming -Hashing -Berechnung effektiv reduzieren kann, kann die Speicherverwendung effektiv reduzieren, und die Hash -Datensätze in der Datenbank bieten zuverlässige Datenunterstützung für die nachfolgende Überprüfung.