Я уже давно изучаю методы шифрования, и на данный момент я обнаружил, что Bcrypt — один из лучших способов сделать это прямо сейчас. Что я пока не понимаю, так это то, как Bcrypt работает точно. Я понимаю, что это занимает больше времени, поэтому брутфорс так трудно.
Но я не понимаю, нужны ли для этого другие меры, такие как случайная соль, чтобы обеспечить ее безопасность. Особенно после прочтения о md5 и о том, что наличие случайной соли почти обязательно, прежде чем хеш станет безопасным.
Вот пример кода, который я нашел на php.com:
$options = [ 'cost' => 12, ];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";
?>
Я предполагаю, что стоимость просто делает так, что она проходит через функцию 12 раз, чтобы зашифровать слово «rasmuslerdorf». И «PASSWORD_BCRYPT» выбирает алгоритм Blowfish.
Есть ли большие различия между PASSWORD_DEFAULT и PASSWORD_BCRYPT?
Достаточно ли мне использовать функцию по умолчанию для шифрования пароля при регистрации. И чем сравнить пароль после его шифрования, что пользователь вводит при входе в систему с зашифрованным паролем в базе данных?
Я предполагаю, что стоимость просто делает так, что она проходит через функцию 12 раз, чтобы зашифровать слово «rasmuslerdorf»
Нет, параметр стоимости влияет на экспоненциальный объем работы.
Но я не понимаю, нужны ли для этого другие меры, такие как случайная соль, чтобы обеспечить ее безопасность.
password_hash()
функция автоматически генерирует случайную соль при каждом ее запуске; альтернативно, пользовательская соль может быть передана через опции:
password_hash('bla', PASSWORD_BCRYPT, ['salt' => ...]);
Передавая специальную соль, вы должны знать, что делаете. Для всех практических целей вы должны безопасно придерживаться автоматически генерируемых солей.
Есть ли большие различия между PASSWORD_DEFAULT и PASSWORD_BCRYPT?
PASSWORD_DEFAULT
Алгоритм предназначен для защиты вашего кода в будущем, всегда используя самый сильный алгоритм, доступный в то время (при условии, что вы обновите PHP). Заметная разница заключается в требованиях к хранению; в то время как Bcrypt всегда использует 60 символов, вам необходимо обеспечить больший объем памяти (например, 255 символов) для всего, что будет использоваться в будущем.
И чем сравнить пароль после его шифрования, что пользователь вводит при входе в систему с зашифрованным паролем в базе данных?
Пожалуйста, посмотрите на password_verify()
примеры того, как проверить пароль, введенный пользователем.
Алгоритм Bcrypt является алгоритмом по умолчанию. Так, PASSWORD_DEFAULT
а также PASSWORD_BCRYPT
подобные. Алгоритм по умолчанию может быть настроен в вашем php.ini
файл, но если вы не знали об этом, то, скорее всего, по-прежнему по умолчанию.
cost
число не сколько раз оно хешируется. Сколько раз он хэшируется, рассчитывается по формуле: 2^cost
, Итак, если стоимость равна 12, то она будет хеширована 2^12
раз (4096
).
Вам не нужно думать о солях при использовании функции. Он сам создает соль и добавляет ее к выходному хешу:
$[algorithm]$[cost]$[salt 22 chars][rest is the hash]
Вы никогда не должны касаться хеша, когда используете функции хеширования пароля. Для проверки пароля против пользователя вы должны использовать password_verify()
,
Используемая вами функция была создана для того, чтобы люди могли хэшировать пароли, не зная, что происходит в фоновом режиме. Это хорошо, потому что когда дело доходит до хеширования паролей, очень легко ошибиться, даже если вы думаете, что знаете, что делаете.