Я знаю, что 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 секунды.