(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — Сравнивает строки без риска атаки по времени
Сравнивает две строки на идентичность так, что значение
параметра 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
и длина известной строки может быть определена в случае атаки по времени.