(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — Comparación de strings resistente a ataques temporales
$known_string
, #[\SensitiveParameter] string $user_string
): bool
Verifica si dos strings son iguales sin revelar información
sobre el contenido de known_string
mediante el tiempo de ejecución.
Esta función puede ser utilizada para mitigar ataques temporales.
La ejecución de una comparación regular con ===
tomará más
o menos tiempo dependiendo de si las dos valores son diferentes o no y
según la posición en la que la primera diferencia pueda ser encontrada,
dejando así filtrar información sobre el contenido
de la known_string
secreta.
Es importante pasar el string proporcionado por el usuario como segundo argumento en lugar del primero.
known_string
El string conocido que debe ser mantenido en secreto.
user_string
El string proporcionado por el usuario a comparar.
Ejemplo #1 Ejemplo dehash_equals()
<?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;
}
?>
El resultado del ejemplo sería:
The value is correctly signed.
Nota:
Ambos argumentos deben tener la misma longitud para ser comparados con éxito. Cuando se pasan argumentos de longitud diferente,
false
es retornado inmediatamente y la longitud del string conocido puede ser revelada en caso de ataque temporal.