Я использую crypt()
для хеширования паролей в PHP и пытаюсь разработать самый безопасный способ проверки равенства полученного хэша при проверке паролей.
Я вижу три варианта:
Вариант 1 — двойное равно
function checkPassword($hash, $password)
{
return crypt($password, $hash) == $hash;
}
Вариант 2 — Тройное равно
function checkPassword($hash, $password)
{
return crypt($password, $hash) === $hash;
}
Вариант 3 – strcmp()
function checkPassword($hash, $password)
{
return strcmp(crypt($password, $hash), $hash) === 0;
}
Моя интуиция подсказывает мне, что вариант 1 — плохая идея из-за отсутствия проверки типов, а варианты 2 или 3, скорее всего, будут лучше. Однако я не могу понять, есть ли конкретный случай, в котором ===
или strcmp
не сработают. Что безопаснее для этой цели?
$2a$10$...$
, когда они преобразуются в числа... - person Polynomial   schedule 05.02.2013===
. Если вы действительно заботитесь о безопасности и потенциальных атаках по времени (даже несмотря на дрожание сети), вам следует взглянуть на в этом или в этом обсуждении или используйтеhash_equals()
функция (PHP 5.6+). - person caw   schedule 17.07.2014