Является ли PHP password_hash () + password_verify () безопасным сегодня (май 2016 года)?

Таким образом, вопрос в значительной степени находится в заголовке ^^.

Ниже приведен небольшой код php, который я сделал для проверки производительности на моем сервере (+ скриншот результата), а также покажу вам, как я намереваюсь использовать очень просто password_hash () и password_verify ().

Думаю, я поеду с PASSWORD_BCRYPT и стоимостью = 11, что вы думаете?

<?php $startpage = microtime(true); $userPassword = "ILike5InchesIceCubes"; echo "<h2>Password we work on : " . $userPassword . "</h2></br></br>"; echo "<b>password_hash($userPassword, PASSWORD_BCRYPT) :</br></b>"; $start1 = microtime(true); $hash = password_hash($userPassword, PASSWORD_BCRYPT); echo "Hash is : " . $hash . "</br>"; echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>"; $start2 = microtime(true); password_verify($userPassword, $hash); echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; echo "<b>password_hash($userPassword, PASSWORD_DEFAULT) :</br></b>"; $start1 = microtime(true); $hash = password_hash($userPassword, PASSWORD_DEFAULT); echo "Hash is : " . $hash . "</br>"; echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>"; $start2 = microtime(true); password_verify($userPassword, $hash); echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; $cost = 4; do { echo "<b>password_hash($userPassword, PASSWORD_BCRYPT, [\"cost\" =>" . $cost . "])</br></b>"; $start1 = microtime(true); $hash = password_hash($userPassword, PASSWORD_BCRYPT, ["cost" => $cost]); echo "Hash is : " . $hash . "</br>"; echo "Encryption took : ". (microtime(true) - $start1) ." seconds </br>"; $start2 = microtime(true); password_verify($userPassword, $hash); echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; $cost++; } while ($cost <= 16); $endpage = microtime(true); echo "The whole page took : ". ($endpage - $startpage) . " seconds </br>"; ?> 

введите описание изображения здесь

Да, password_hash() – это путь. В Security StackExchange есть отличная статья с дополнительной информацией:

Использование bcrypt – хорошее начало; это рекомендуемый выбор (или, по крайней мере, один из рекомендуемых вариантов). Документация, похоже, указывает на то, что PHP, наконец, делает все правильно. Убедитесь, что ваша версия PHP не менее 5.5.0. Не пытайтесь возиться солями: по умолчанию функция будет генерировать случайную соль, когда это необходимо, и это правильный способ сделать это, поэтому просто дайте ей выполнить свою работу.

Вы также должны попробовать изменить «стоимость». Для bcrypt стоимость составляет от 4 до 31; каждый шаг означает, что хеширование пароля в два раза дороже, как для вашего сервера, так и для злоумышленника. На практике вы хотите сделать так высоко, насколько это возможно, учитывая мощность вашего сервера, среднюю нагрузку, максимальную нагрузку и максимальное терпение пользователя: это даст вам лучшую безопасность, на которую вы можете надеяться.

(Заметьте, что я сказал «лучший», а не «хороший».)

Если вы хотите понять основные понятия для хорошего хэширования паролей и почему bcrypt – хороший выбор, начинайте здесь .

password_hash() был значительно улучшен в PHP 5.5+, и это, наряду с PASSWORD_BCRYPT , должно быть хорошим способом.