Les fonctions de hachage sont un outil très courant lors de la vérification de l'intégrité des données ou de la vérification du mot de passe. Cependant, l'utilisation des comparaisons de hachage (telles que == ou === ) n'empêche pas et ne détecte pas efficacement les conflits de hachage potentiels. Pour améliorer la sécurité, PHP fournit deux fonctions: HASH_FINAL et HASH_EQUALS , qui aident les développeurs à gérer les opérations de hachage plus en toute sécurité.
Cet article introduira l'utilisation de ces deux fonctions et utilisera un exemple pratique pour montrer comment les utiliser pour obtenir la détection de collision de hachage.
HASH_FINAL est la dernière étape lors de la création de calculs de hachage étape par étape à l'aide de hash_init et hash_update . Il renvoie la valeur de hachage finale.
Exemple:
<?php
$context = hash_init('sha256');
hash_update($context, 'hello');
$hash = hash_final($context);
echo $hash;
Ici, nous initialisons un contexte de hachage de SHA-256 avec hash_init , puis utilisons hash_update pour ajouter les données à hash, et nous utilisons enfin Hash_Final pour obtenir le résultat du hachage final.
Hash_Equals est utilisé pour comparer en toute sécurité deux valeurs de hachage. Contrairement à l'utilisation de == directement, il peut prévenir tôt les attaques de synchronisation causées par la comparaison des chaînes. L'attaque de synchronisation est une méthode d'attaque qui spécifie des informations sensibles en mesurant le temps requis pour une opération.
Exemple:
<?php
$knownHash = hash('sha256', 'known_value');
$userInputHash = hash('sha256', $_POST['input']);
if (hash_equals($knownHash, $userInputHash)) {
echo 'Correspondre avec succès!';
} else {
echo 'Le match a échoué。';
}
Ici, même si la valeur saisie par l'utilisateur n'est qu'une partie de la valeur correcte, Hash_Equals sera complètement comparé par octet d'octet pour éviter de fuir la différence de temps pendant le processus de comparaison.
Supposons que nous devons détecter si les données soumises par l'utilisateur sont en conflit avec les données existantes sur le hachage (c'est-à-dire que différentes données produisent la même valeur de hachage). Nous pouvons faire ceci:
Utilisez HASH_INIT , HASH_UPDATE et HASH_FINAL pour calculer le hachage des données existantes.
Calculez le hachage des données utilisateur de la même manière.
Utilisez Hash_Equals pour comparer deux valeurs de hachage.
Exemple de code:
<?php
// Simuler les données existantes
$existingData = 'Original content';
$context1 = hash_init('sha256');
hash_update($context1, $existingData);
$existingHash = hash_final($context1);
// Données soumises par l'utilisateur
$userData = $_POST['user_data'];
$context2 = hash_init('sha256');
hash_update($context2, $userData);
$userHash = hash_final($context2);
// Comparez les valeurs de hachage
if (hash_equals($existingHash, $userHash)) {
echo 'Conflit de hachage détecté!Les données peuvent être identiques ou produire la même valeur de hachage。';
} else {
echo '未Conflit de hachage détecté。';
}
Avis:
Bien que la même valeur de hachage détectée puisse être dû au fait que les données sont les mêmes, elle peut également être théoriquement due à de rares collisions de hachage. Par conséquent, cette méthode de détection est plus adaptée à la défense ou à la vérification plutôt que de s'appuyer entièrement sur le hachage pour juger la cohérence des données.
En utilisant Hash_Final et Hash_Equals , nous pouvons non seulement calculer et comparer en toute sécurité les hachages, mais aussi empêcher les attaques de synchronisation et détecter les conflits de hachage potentiels dans une certaine mesure. Dans les scénarios impliquant la sécurité, il est recommandé d'utiliser ces outils au lieu de comparaisons de chaînes simples.
Dans les applications pratiques, par exemple:
Vérifiez l'intégrité des fichiers téléchargés
Vérifiez le mot de passe (utilisez avec Password_Hash et Password_Verify )
Détecter la signature de l'appel d'interface
Ces fonctions peuvent toutes être utilisées pour améliorer la sécurité.
Si vous voulez en savoir plus, il est recommandé de consulter la documentation officielle PHP .