hash_equals

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

hash_equalsСравнивает строки без риска атаки по времени

Описание

hash_equals(#[\SensitiveParameter] string $known_string, #[\SensitiveParameter] string $user_string): bool

Функция сравнивает две строки на идентичность так, что значение параметра known_string нельзя раскрыть методами, которые основаны на знании времени исполнения функции.

Эту функцию можно вызывать для снижения риска атак по времени. Обычное сравнение через оператор === будет занимать разное время в зависимости от того, разные это значения или нет и в какой позиции первое отличие будет найдено, так раскрывается значение параметра known_string.

Предостережение

Внимание! Передавать полученную от пользователя строку необходимо во второй параметр, а не в первый.

Список параметров

known_string

Известная строка (string), которая должна держаться в секрете.

user_string

Пользовательская строка (string) для сравнения.

Возвращаемые значения

Функция возвращает true, если строки идентичны, и false, если нет.

Примеры

Пример #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, и длина известной строки может быть раскрыта при атаке по времени.

Смотрите также

  • hash_hmac() - Генерирует хеш-код на основе ключа через метод HMAC

add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top