Position actuelle: Accueil> Derniers articles> La différence et les avantages de la fonction PHP HASH_EQUALS et STRCMP

La différence et les avantages de la fonction PHP HASH_EQUALS et STRCMP

gitbox 2025-05-26

En PHP, lorsque nous devons comparer si deux chaînes sont égales, la méthode couramment utilisée est la fonction STRCMP . Cependant, avec l'augmentation des exigences de sécurité, PHP 5.6 a introduit une fonction Hash_Equals spécifiquement pour la comparaison de sécurité. Cet article présentera les différences entre ces deux fonctions en détail et expliquera pourquoi HASH_EQUALS est recommandé dans certains scénarios.


1. Comparaison des fonctions de base de StrCMP et Hash_Equals

  • strcmp (String $ str1, string $ str2): int
    STRCMP est utilisé pour comparer deux chaînes dans l'ordre du dictionnaire. Il renvoie une valeur entière:

    • 0 signifie que les deux cordes sont exactement les mêmes

    • Les nombres négatifs indiquent que la première chaîne est plus petite que la deuxième chaîne

    • Le nombre positif signifie que la première chaîne est supérieure à la deuxième chaîne

  • hash_equals (String $ connu_string, string $ user_string): bool
    Hash_equals est spécifiquement utilisé pour comparer si deux chaînes sont exactement les mêmes, et le processus de comparaison est un moyen sûr d'empêcher les attaques de synchronisation. Il renvoie une valeur booléenne:

    • Le vrai signifie que deux cordes sont exactement égales

    • faux signifie inégal


2. Attaque de timing et ses risques

Dans certains scénarios de sécurité, tels que la vérification des données sensibles telles que le hachage de mot de passe, la clé API, la signature, etc., un attaquant peut déduire la longueur de la même partie de la chaîne en mesurant le temps d'exécution de la fonction de comparaison, puis devinez progressivement la clé correcte. Les fonctions de comparaison de chaîne ordinaires (telles que StrCMP ) reviendront immédiatement lorsque le premier caractère différent sera trouvé, ce qui entraîne le temps de comparaison lié à la longueur de partie de la chaîne, qui est sujette à des informations fuites.


3. Les avantages de sécurité de Hash_equals

Hash_equals est conçu avec une considération particulière pour empêcher les attaques de synchronisation. Le temps de comparaison ne change pas avec la longueur de la même partie des deux chaînes, mais corrige plutôt le temps d'exécution, réduisant ainsi le risque de divulguer des informations.


4. Comparaison des exemples de code réels

 <?php
// utiliser strcmp Comparaison de deux cordes
$known = 'securetoken123';
$userInput = 'securetoken124';

if (strcmp($known, $userInput) === 0) {
    echo "Correspondre avec succès(strcmp)";
} else {
    echo "Le match a échoué(strcmp)";
}
?>
 <?php
// utiliser hash_equals Comparaison de deux cordes
$known = 'securetoken123';
$userInput = 'securetoken124';

if (hash_equals($known, $userInput)) {
    echo "Correspondre avec succès(hash_equals)";
} else {
    echo "Le match a échoué(hash_equals)";
}
?>

Notez que dans la comparaison des chaînes dans le code ci-dessus, STRCMP reviendra immédiatement sur le premier caractère différent, et Hash_Equals effectuera la comparaison complète.


5. Quand est-il recommandé d'utiliser Hash_equals?

  • Vérifiez le mot de passe Hash : Bien que la plupart des vérifications de mot de passe réussissent Password_verify , il est recommandé d'utiliser Hash_Equals si vous implémentez le hachage de comparaison par vous-même.

  • Comparez les signatures cryptées : par exemple HMAC, JWT, etc. pour éviter de deviner la clé.

  • Tokens de sécurité comparatifs : clés API, jetons d'accès, codes de vérification, etc.

Autrement dit, il est recommandé d'utiliser HASH_EQUALS pour toute comparaison de chaîne liée à la sécurité.


6. Précautions pour une utilisation

  • Hash_Equals exige que les deux paramètres passés sont des chaînes et ont la même longueur, sinon FAUX sera directement retourné.

  • Avant d'utiliser HASH_Equals , il est recommandé de s'assurer que les chaînes d'entrée sont de type de chaîne et ont la même longueur pour éviter les erreurs inattendues.


Conclusion

Bien que STRCMP soit une fonction de comparaison de chaînes couramment utilisée et puissante, dans des occasions sûres et sensibles, Hash_Equals est un choix plus approprié en raison de sa caractéristique de prévenir les attaques chronométrées. L'utilisation correcte de HASH_Equals peut efficacement améliorer la sécurité de l'application et éviter les risques d'attaque potentiels.