(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — Comparação de strings segura para ataque de temporização
$known_string
, #[\SensitiveParameter] string $user_string
): bool
Verifica se duas strings são iguais sem vazar informações sobre o
conteúdo de known_string
por meio do tempo de execução.
Esta função pode ser usada para mitigar ataques de temporização. Executar uma
comparação regular com ===
levará mais ou menos tempo para executar
dependendo se os dois valores são diferentes ou não e em qual
posição a primeira diferença pode ser encontrada, vazando assim informações sobre
o conteúdo do known_string
secreto.
É importante fornecer a string fornecida pelo usuário como o segundo parâmetro, em vez do primeiro.
Exemplo #1 Exemplo de hash_equals()
<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';
// O valor e a assinatura são fornecidos pelo usuário, por exemplo, dentro da URL
// e recuperados usando $_GET.
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';
if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "O valor está assinado corretamente.", PHP_EOL;
} else {
echo "O valor foi adulterado.", PHP_EOL;
}
?>
O exemplo acima produzirá:
O valor está assinado corretamente.
Nota:
Ambos os argumentos devem ter o mesmo comprimento para serem comparados com sucesso. Quando argumentos de comprimentos diferentes são fornecidos,
false
é retornado imediatamente e o comprimento da string conhecida pode ser vazado em caso de um ataque de temporização.