Dans PHP, nous pouvons calculer la valeur de hachage d'un grand fichier via hash_update_stream pour assurer l'intégrité du fichier. Combiné avec le hachage du fichier d'enregistrement de la base de données, vous pouvez rapidement comparer la valeur de hachage du fichier lors de la vérification ultérieure de l'intégrité du fichier pour s'assurer que le fichier n'a pas été falsifié. Cet article expliquera en détail comment mettre en œuvre ce processus.
La fonction hash_update_stream est utilisée pour calculer les valeurs de hachage à partir d'un flux de fichiers. Par rapport à la méthode de chargement des fichiers dans la mémoire à la fois, l'utilisation du traitement de streaming peut économiser efficacement la mémoire, ce qui convient particulièrement au traitement des fichiers volumineux.
bool hash_update_stream ( resource $context , resource $handle [, int $length ] )
$ Context : Hash Context initialisé par hash_init () .
$ Handle : une poignée de fichier valide.
$ la longueur (facultatif): le nombre d'octets lus en même temps, la valeur par défaut est 8192 octets.
Cette fonction est généralement utilisée avec hash_init () et hash_final () , qui est utilisée pour renvoyer la valeur de hachage calculée finale.
En utilisant hash_update_stream , nous pouvons diffuser les résultats de calcul de hachage du fichier dans la base de données. Lors de la vérification, nous devons seulement recalculer la valeur de hachage du fichier et le comparer avec les valeurs stockées dans la base de données pour obtenir la vérification de l'intégrité du fichier.
Voici les brèves étapes de l'ensemble du processus:
Lors du téléchargement d'un fichier, la valeur de hachage du fichier est calculée et stockée dans la base de données.
Lors de la vérification du fichier, le hachage est lu dans la base de données et comparé au hachage nouvellement calculé.
Si les deux correspondent, cela signifie que le fichier n'a pas été falsifié; Sinon, l'intégrité du fichier sera remise en question.
Tout d'abord, concevez une table de base de données simple pour enregistrer les informations du fichier et ses valeurs de hachage. Nous supposons qu'il existe déjà un tableau de fichiers dans la base de données, avec la structure comme suit:
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
);
Le nom de fichier stocke le nom du fichier, Hash Stores la valeur de hachage du fichier, téléchargé_at enregistre l'heure de téléchargement.
Lorsqu'un utilisateur télécharge un fichier, nous passons le flux de fichier à hash_update_stream pour calculer la valeur de hachage du fichier et stocker le nom du fichier et sa valeur de hachage dans la base de données.
<?php
// Assumer le traitement de téléchargement de fichiers
if (isset($_FILES['file'])) {
// Obtenez des informations sur le téléchargement de fichiers
$fileTmpPath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
// Initialiser le calcul du hachage
$hashContext = hash_init('sha256');
// Ouvrez le flux de fichiers
$fileHandle = fopen($fileTmpPath, 'rb');
// Calculer la valeur de hachage
while (!feof($fileHandle)) {
// Mettre à jour le hachage
hash_update_stream($hashContext, $fileHandle);
}
// Obtenez la valeur de hachage finale
$fileHash = hash_final($hashContext);
// Enregistrer la valeur de hachage dans la base de données
$db = new mysqli('localhost', 'root', '', 'file_db');
$stmt = $db->prepare("INSERT INTO files (filename, hash) VALUES (?, ?)");
$stmt->bind_param("ss", $fileName, $fileHash);
$stmt->execute();
// Fermez la poignée du fichier
fclose($fileHandle);
}
?>
Dans cet exemple, nous utilisons hash_init () pour initialiser un contexte de hachage de SHA-256, puis utilisons hash_update_stream () pour calculer la valeur de hachage du fichier téléchargé, et enfin utiliser hash_final () pour obtenir la valeur de hachage et le stocker dans la base de données.
Dans le processus de vérification ultérieur, nous pouvons obtenir la valeur de hachage correspondante à partir de la base de données en fonction du nom de fichier et le comparer avec la valeur de hachage du fichier actuel.
<?php
// Assumer le traitement de vérification des fichiers
$fileNameToVerify = 'example_file.txt'; // Supposons que le nom du fichier doit être vérifié
$filePath = '/path/to/files/' . $fileNameToVerify;
// Obtenez la valeur de hachage dans la base de données
$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'];
// Calculez la valeur de hachage du fichier actuel
$hashContext = hash_init('sha256');
$fileHandle = fopen($filePath, 'rb');
while (!feof($fileHandle)) {
hash_update_stream($hashContext, $fileHandle);
}
$currentHash = hash_final($hashContext);
fclose($fileHandle);
// Comparaison des valeurs de hachage dans la base de données avec les valeurs de hachage actuellement calculées
if ($currentHash === $storedHash) {
echo "La vérification de l'intégrité du fichier a été adoptée!";
} else {
echo "La vérification de l'intégrité du fichier a échoué!";
}
?>
Pendant la vérification, nous obtenons d'abord la valeur de hachage du fichier à partir de la base de données, puis recalculons la valeur de hachage du fichier et enfin comparer. Si les deux hachages sont les mêmes, cela signifie que le fichier n'a pas été modifié; S'il est incohérent, le fichier peut avoir été falsifié.
En combinant hash_update_stream et valeurs de hachage de fichiers de journalisation de la base de données, nous pouvons vérifier efficacement l'intégrité du fichier. Qu'il s'agisse de télécharger des fichiers ou une vérification ultérieure, le calcul du hachage de streaming peut réduire efficacement l'utilisation de la mémoire, et les enregistrements de hachage dans la base de données fournissent une prise en charge fiable des données pour la vérification ultérieure.