Dans PHP, la fonction HASH_FINAL est utilisée pour terminer la dernière étape d'un contexte de hachage (créé par hash_init ) et renvoyer la valeur de hachage calculée. Il appartient à l'extension de hachage de PHP et est généralement utilisé avec hash_init , hash_update , hash_update_stream et hash_update_file .
Ainsi, lorsque nous utilisons Hash_Final pour calculer les valeurs de hachage, comment les différents formats de données (tels que les chaînes, les données binaires, les flux de fichiers, etc.) seront-ils gérés? Cet article sera discuté en détail.
Regardons d'abord un exemple de base:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello World');
$hash = hash_final($context);
echo $hash;
?>
Cet extrait de code sortira la valeur de hachage SHA-256 du monde de chaîne Hello World (en hexadécimal).
Avis:
Le deuxième paramètre reçu par hash_update est une chaîne.
Quel que soit le type que vous fournissez (tant qu'il peut être converti en une chaîne), il sera finalement traité comme une séquence d'octets.
Lorsque vous passez dans une chaîne (que ce soit en codage ASCII ou UTF-8), PHP le traitera directement dans des séquences d'octets.
Par exemple:
hash_update($context, "abc"); // Ce qui traite '61 62 63' Trois octets
Remarque: les caractères multi-octets (tels que chinois) sont également calculés en entrant dans le hachage en fonction de leur séquence d'octets sous-jacente, plutôt qu'à la granularité du "caractère".
Si vous transmettez des données binaires, par exemple, un flux binaire obtenu via File_get_Contents , il est également directement nourri par des octets:
$data = file_get_contents('https://gitbox.net/image.png');
hash_update($context, $data);
Les données $ ici peuvent contenir \ 0 (octet nul), octet élevé, etc. PHP n'effectuera aucun filtrage ou échappement, et entrera dans le calcul du hachage tel quel.
Si vous souhaitez calculer le hachage pour les fichiers volumineux, il est recommandé d'utiliser hash_update_stream :
$fp = fopen('https://gitbox.net/largefile.zip', 'rb');
$context = hash_init('sha256');
hash_update_stream($context, $fp);
$hash = hash_final($context);
fclose($fp);
Ici, le contenu du fichier est lu en morceaux et alimenté dans le contexte de hachage pour éviter de charger le fichier entier en mémoire à la fois.
Si vous souhaitez calculer directement le hachage sur un fichier, vous pouvez utiliser Hash_File , mais si vous souhaitez utiliser la famille de fonctions hash_ * , vous avez besoin:
$context = hash_init('sha256');
hash_update_file($context, 'https://gitbox.net/document.pdf');
$hash = hash_final($context);
hash_update_file ouvre automatiquement le fichier, lit son contenu et met à jour le contexte.
Hash_Final termine juste les données accumulées.
Avant que les données entrent dans le contexte ( hash_update , hash_update_stream , hash_update_file ) a été lue dans des séquences d'octets et ne se soucie pas du "type de données" d'origine.
Vous devez vous assurer que les données que vous transmettez sont ce que vous voulez avoir (en particulier les problèmes d'encodage ou de sécurité binaire).