Генерация паролей в PHP 5.5 и настройка стоимости

Я знаю, что PHP 5.5 находится в альфа, но этот класс, который я делаю, просто делается заранее, чтобы использовать его хэширование с помощью функции function_exists ().

Я проверил документацию password_hash . Третий аргумент – $ options, который в настоящее время поддерживает два варианта: «соль» и «стоимость».

В нем говорится следующее:

стоимость, которая обозначает алгоритмическую стоимость, которая должна использоваться. Примеры этих значений можно найти на странице crypt ().

Когда я перехожу на страницу crypt (), она дает следующую документацию:

Blowfish хеширует солью следующим образом: «$ 2a $», «$ 2x $» или «$ 2y $», двухзначный параметр стоимости, «$» и 22 цифры от алфавита »./0-9A-Za -z». Использование символов вне этого диапазона в соли приведет к тому, что crypt () вернет строку нулевой длины. Параметр стоимости двух цифр является логарифмом базы-2 итерации для базового алгоритма хэширования на основе Blowfish и должен находиться в диапазоне 04-31, значения вне этого диапазона вызовут сбой crypt (). Версии PHP до 5.3.7 поддерживают только «$ 2a $» в качестве префикса соли: PHP 5.3.7 представил новые префиксы, чтобы исправить уязвимость безопасности в реализации Blowfish. Пожалуйста, обратитесь к »этому документу для получения полной информации об исправлении безопасности, но для обобщения разработчики, ориентированные только на PHP 5.3.7 и более поздние, должны использовать« $ 2y $ »вместо« $ 2a $ ».

Кажется, я не могу обмануть голову. Он говорит, что PHP 5.3.7 и более поздние версии должны использовать $ 2y $, но какую стоимостную стоимость я использую, чтобы получить эту, и это лучшее значение для выбора? В примере, который они предоставляют, используется значение 7, но, согласно вышеизложенному, оно может увеличиться до 31, какая разница заключается в том, чтобы использовать, скажем, 4 против 31?

Функция password_hash() является всего лишь оболочкой функции crypt() и упрощает ее использование. Он заботится о создании безопасной случайной соли и обеспечивает хорошие значения по умолчанию.

Самый простой способ использовать эту функцию:

 $hash = password_hash($password, PASSWORD_DEFAULT); 

Это означает, что функция будет хешировать пароль с помощью BCrypt (алгоритм 2y ), генерирует случайную соль и использует стоимость по умолчанию (на данный момент это 10). Это хорошие значения по умолчанию, особенно я не буду генерировать соль самостоятельно, там легко ошибиться.

Если вы хотите изменить параметр стоимости, вы можете сделать это следующим образом:

 $hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 11]); 

При увеличении параметра стоимости на 1 удваивается необходимое время для вычисления значения хэш-функции. Параметр стоимости – это логарифм (base-2) счетчика итераций, что означает:

 $iterations = 2 ^ $cost; 

Редактировать:

Я пропустил мысль, что вы хотите создать свой собственный класс. Для PHP версии 5.3.7 и более поздних версий существует пакет совместимости от того же автора, который сделал функцию password_hash() . Вы можете использовать этот код напрямую или посмотреть на хорошо продуманную реализацию. Для версий PHP до 5.3.7 нет поддержки для crypt с 2y , алгоритмом BCrypt, поддерживающим unicode. Вместо этого вы можете использовать 2a , что является лучшей альтернативой для ранних версий PHP. Я сделал пример с большим количеством комментариев, возможно, вы тоже хотите посмотреть на него.

PS Выражения «соль» и «коэффициент затрат» используются правильно в функции password_hash() , однако функция crypt () использует слово «соль» для всех параметров склепа вместе, это немного вводит в заблуждение.

Отказ от ответственности: это с PHP 5.3.10 , но, похоже, он не отличается от вашего описания.

Стоимость относится к стоимости вычислений. Когда вы увеличиваете стоимость, для хэша требуется больше времени.

 function blowfish_salt($cost) { $chars = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $salt = sprintf('$2y$%02d$', $cost); for ($i = 0; $i < 22; ++$i) $salt .= $chars[rand(0,63)]; return $salt; } $password = 'My perfect password'; $cost = $argv[1]; $salt = blowfish_salt($cost); $hash = crypt($password, $salt); 

Когда я запускаю это на моей (старой) машине, как

 php mycrypt.php 10 

он немедленно возвращается (~ 0,2 сек), тогда как с

 php mycrypt.php 16 

он занимает около 5,2 секунды.