Dans PHP, Hash_Final est une fonction importante utilisée avec hash_init et hash_update . Il est principalement utilisé pour générer des digestions de hachage (c'est-à-dire des signatures) pour vérifier l'intégrité des données. Cet article expliquera en détail comment utiliser correctement HASH_FINAL pour générer des signatures et assurer l'intégrité des messages pendant la transmission ou les procédures stockées.
HASH_FINAL est une fonction dans l'extension de hachage fournie par PHP, qui est utilisée pour effectuer une opération de hachage étape par étape et renvoyer le résultat. Son flux de travail de base est le suivant:
Initialisez un contexte de hachage à l'aide de hash_init .
Utilisez Hash_update pour ajouter les données pour devoir être haché dans le contexte (peut être appelé plusieurs fois pour traiter de grands blocs de données).
Utilisez Hash_Final pour obtenir la valeur de hachage finale (signature).
Cette approche étape par étape est particulièrement adaptée à la gestion des fichiers importants ou des données de streaming, car vous n'avez pas besoin de charger le contenu entier en mémoire à la fois.
Regardons un exemple simple, qui simule la signature d'un message:
<?php
$message = 'Ceci est un message qui nécessite une signature';
$algo = 'sha256';
// Initialiser le contexte du hachage
$context = hash_init($algo);
// Mettre à jour le contexte du hachage,Les données peuvent être ajoutées plusieurs fois
hash_update($context, $message);
// Obtenez la signature finale(résumé)
$signature = hash_final($context);
// Signature de sortie
echo "signe: " . $signature . "\n";
?>
Dans cet exemple, nous utilisons l'algorithme SHA256 pour générer un digestion du message. La sortie est une valeur de hachage codée hexadécimale, qui peut être utilisée pour vérifier l'intégrité du message à l'extrémité de réception.
La génération d'une signature ne suffit pas, la clé est de savoir comment vérifier la signature. Un processus complet se compose généralement des étapes suivantes:
1 ?? Envoyer :
Générer une signature.
Envoyez le message et la signature au récepteur.
2 ?? Récepteur :
Message reçu.
Régénérer la signature du message en utilisant le même algorithme.
Comparez si la signature reçue est cohérente avec la signature calculée.
Exemple de code (vérification du récepteur):
<?php
$received_message = 'Ceci est un message qui nécessite une signature';
$received_signature = '发送端提供的signe';
$algo = 'sha256';
// 重新计算signe
$context = hash_init($algo);
hash_update($context, $received_message);
$calculated_signature = hash_final($context);
// 比较signe
if (hash_equals($received_signature, $calculated_signature)) {
echo "Le message est complet,Pas falsifié。\n";
} else {
echo "avertir:Le message peut avoir été falsifié!\n";
}
?>
? Remarque : L'utilisation de hash_equals pour comparer les signatures au lieu d'utiliser == peut empêcher les attaques temporelles.
Supposons que vous souhaitiez que l'utilisateur télécharge un fichier depuis https://gitbox.net/download/file.zip et fournissez une valeur de hachage pour la vérification, vous pouvez le faire:
<?php
$file = 'file.zip';
$algo = 'sha256';
// Open Streaming de fichiers
$context = hash_init($algo);
$handle = fopen($file, 'rb');
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
// 获取文件的signe(Valeur de hachage)
$hash = hash_final($context);
echo "Lien de téléchargement: https://gitbox.net/download/file.zip\n";
echo "Hachage de fichiers(Utilisé pour vérifier l'intégrité): $hash\n";
?>
Les téléchargeurs peuvent utiliser le même algorithme pour calculer la valeur de hachage du fichier téléchargé pour s'assurer qu'il est cohérent avec la valeur fournie, vérifiant ainsi que le fichier est complet et n'a pas été falsifié.