Генерация паролей в PHP 5.5 и настройка стоимости
Я знаю, что PHP 5.5 находится в альфа, но этот класс, который я делаю, выполняется заранее, чтобы использовать его функцию хэширования с помощью функции_функции().
Я проверил документацию 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?
Ответы
Ответ 1
Функция 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;
Edit:
Я пропустил мысль, что вы хотите создать свой собственный класс. Для PHP версии 5.3.7 и более поздних версий существует пакет совместимости от того же автора, который сделал функцию password_hash()
. Вы можете использовать этот код напрямую или посмотреть на хорошо продуманную реализацию. Для версий PHP до 5.3.7 нет поддержки crypt
с 2y
, алгоритмом BCrypt, поддерживающим unicode. Вместо этого вы можете использовать 2a
, что является лучшей альтернативой для более ранних версий PHP. Я сделал пример с большим количеством комментариев, возможно, вы тоже хотите посмотреть на него.
P.S. Выражения "соль" и "коэффициент затрат" используются правильно в password_hash()
, однако функция crypt() использует слово salt для всех параметров склепа вместе, что немного вводит в заблуждение.
Ответ 2
Отказ от ответственности: это с 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 секунды.