(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — Сравнивает строки без риска атаки по времени
$known_string
, #[\SensitiveParameter] string $user_string
): bool
Функция сравнивает две строки на идентичность так, что значение
параметра known_string
нельзя раскрыть
методами, которые основаны на знании времени исполнения функции.
Эту функцию можно вызывать для снижения риска атак по времени. Обычное сравнение
через оператор ===
будет занимать разное время в зависимости от того,
разные это значения или нет и в какой позиции первое отличие будет найдено, так раскрывается значение
параметра known_string
.
Внимание! Передавать полученную от пользователя строку необходимо во второй параметр, а не в первый.
Пример #1 Пример использования функции hash_equals()
<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';
// Значение и подпись предоставляются пользователем, например, внутри URL-адреса,
// и были извлечены из суперглобальной переменной $_GET.
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';
if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "Значение подписали правильно.", PHP_EOL;
} else {
echo "Значение подделали.", PHP_EOL;
}
?>
Результат выполнения приведённого примера:
Значение подписали правильно.
Замечание:
Для успешного сравнения оба аргумента должны быть одинаковой длины. Если передали аргументы разной длины, функция сразу возвращает
false
, и длина известной строки может быть раскрыта при атаке по времени.