Генерация паролей в PHP 5.5 и настройка стоимости - программирование
Подтвердить что ты не робот

Генерация паролей в 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?

4b9b3361

Ответ 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 секунды.