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.
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
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.
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.
<?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.
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é.
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.
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.