Position actuelle: Accueil> Derniers articles> FAQS lors de l'utilisation de Hash_Final pour le calcul du hachage cryptographique

FAQS lors de l'utilisation de Hash_Final pour le calcul du hachage cryptographique

gitbox 2025-05-27

Dans PHP, la fonction HASH_FINAL est un outil utilisé pour compléter un contexte de hachage incrémentiel et renvoyer la valeur de hachage finale. Il est généralement utilisé en conjonction avec des fonctions telles que Hash_Init , Hash_update , etc., pour gérer les calculs de hachage de grandes données ou de données de streaming. Cependant, de nombreux développeurs rencontreront des problèmes courants lors de l'utilisation de Hash_final . Cet article analysera ces problèmes en détail et fournira des solutions.

1. Qu'est-ce que Hash_final

La définition de Hash_final est la suivante:

 string hash_final ( HashContext $context [, bool $raw_output = FALSE ] )
  • $ Context : contexte de hachage créé par hash_init .

  • $ raw_output : Si défini sur true , sortit les données binaires brutes; Sinon, sortiez la chaîne hexadécimale minuscule.

Exemple simple:

 $context = hash_init('sha256');
hash_update($context, 'hello');
$finalHash = hash_final($context);
echo $finalHash;

2. Des questions et des solutions fréquemment posées

1 ?? Question: plusieurs appels à hash_final ont échoué

Phénomène:
Une fois que Hash_final est appelé, le contexte $ associé devient invalide. Si vous essayez à nouveau d'utiliser le même contexte, par exemple:

 $context = hash_init('sha256');
hash_update($context, 'hello');
$final1 = hash_final($context);
$final2 = hash_final($context); // erreur!

Provoquera un avertissement ou une erreur.

Solution:
Si vous devez réutiliser le contexte, appelez Hash_Copy avant Hash_Final :

 $context = hash_init('sha256');
hash_update($context, 'hello');
$contextCopy = hash_copy($context);
$final1 = hash_final($context);
$final2 = hash_final($contextCopy);

2 ?? Question: Le paramètre RAW_Output est mal utilisé

Phénomène:
Beaucoup de gens ne prennent que la sortie de chaîne par défaut, ignorant que $ raw_output = true renvoie en fait le binaire. Si vous utilisez Echo pour sortir directement, vous obtiendrez du code brouillé:

 $context = hash_init('sha256');
hash_update($context, 'hello');
$final = hash_final($context, true);
echo $final; // Les codes à ordures peuvent être affichés

Solution:
Pour afficher le contenu lisible, vous pouvez utiliser Bin2Hex ou Base64_Encode :

 $final = hash_final($context, true);
echo bin2hex($final);

3 ?? Problème: les données d'entrée sont trop grandes et la mémoire est débordante

Phénomène:
Lorsque vous utilisez du hachage pour les fichiers volumineux ou les flux de big data, l'utilisation de hash () consomme directement beaucoup de mémoire:

 $hash = hash('sha256', file_get_contents('largefile.dat'));

Solution:
Utilisez hash_init + hash_update pour diffuser:

 $context = hash_init('sha256');
$handle = fopen('largefile.dat', 'rb');
while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update($context, $data);
}
fclose($handle);
$finalHash = hash_final($context);

4 ?? Question: les valeurs de hachage entre langue sont incohérentes

Phénomène:
Les mêmes données d'entrée sont incompatibles avec les valeurs de hachage calculées en PHP dans d'autres langues (comme Python, Node.js).

Solution:
s'assurer:

  • Le codage d'entrée est cohérent (UTF-8 vs UTF-16).

  • Qu'il y ait des pauses ou des espaces supplémentaires.

  • Calculé de la même manière (texte original vs codé).

Exemple: Calculez le hachage SHA-256 d'une chaîne codée UTF-8 à l'aide de PHP:

 $context = hash_init('sha256');
hash_update($context, mb_convert_encoding($input, 'UTF-8'));
$finalHash = hash_final($context);

5 ?? Question: Vérification du hachage pour une mauvaise utilisation du traitement de l'URL

Phénomène:
Lorsque la vérification du hachage de l'URL, la normalisation est ignorée, ce qui entraîne différents hachages pour la même adresse:

 $url1 = 'https://gitbox.net/page';
$url2 = 'https://gitbox.net/page/';

Solution:
Normalisez l'URL avant le calcul, par exemple:

 function normalizeUrl($url) {
    $parsed = parse_url($url);
    $scheme = $parsed['scheme'] ?? 'http';
    $host = $parsed['host'] ?? '';
    $path = rtrim($parsed['path'] ?? '/', '/');
    return "$scheme://$host$path";
}

$context = hash_init('sha256');
hash_update($context, normalizeUrl('https://gitbox.net/page/'));
$finalHash = hash_final($context);