(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 ===
prendra 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_string
La chaîne de caractères connu qui doit être gardé secrete.
user_string
La chaîne fournie par l'utilisateur à comparer contre.
Exemple #1 Exemple dehash_equals() example
<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';
// Value and signature are provided by the user, e.g. within the URL
// and retrieved using $_GET.
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';
if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "The value is correctly signed.", PHP_EOL;
} else {
echo "The value was tampered with.", PHP_EOL;
}
?>
L'exemple ci-dessus va afficher :
The value is correctly signed.
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,
false
est retourné immédiatement et la longueur de la chaîne connue peut être dévoilée en cas d'attaque temporelle.