(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — Comparaison de chaînes résistante aux attaques temporelles
$known_string, #[\SensitiveParameter] string $user_string): bool
Vérifie si deux chaînes de caractères sont égales sans divulguer d'informations
sur le contenu de known_string via le temps d'exécution.
Cette fonction peut être utilisée pour atténuer les attaques temporelles.
L'exécution d'une comparaison régulière avec === prend plus
ou moins de temps selon que les deux valeurs sont différentes ou non et
selon la position à laquelle la première différence peut être trouvée,
laissant ainsi filtrer des informations sur le contenu
de la known_string secrète.
Il est important de passer la chaîne fournie par l'utilisateur en tant que second paramètre plutôt qu'en premier.
known_stringLa chaîne de caractères connue qui doit être gardée secrète.
user_stringLa chaîne fournie par l'utilisateur à comparer contre.
Exemple #1 Exemple avec hash_equals()
<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';
// La valeur et la signature sont fournies par l'utilisateur, par ex. dans l'URL
// et récupérées en utilisant $_GET.
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';
if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "La valeur est correctement signée.", PHP_EOL;
} else {
echo "La valeur a été altérée.", PHP_EOL;
}
?>L'exemple ci-dessus va afficher :
La valeur est correctement signée.
Note:
Les deux arguments doivent être de même longueur pour être comparés avec succès. Quand des arguments de longueur différente sont passés,
falseest retourné immédiatement et la longueur de la chaîne connue peut être dévoilée en cas d'attaque temporelle.