Хранение bcrypt хэшей
Согласно документу PHP, соль bcrypt состоит из
"$2a$", двухзначный параметр стоимости, "$" и 22 цифры из алфавита "./0-9A-Za-z"
Итак, если я использую функцию crypt() для хеширования своих паролей, в результате получим первые 7 символов ($2a$10$, если 10 - параметр стоимости) как часть соли - и, согласно всем примерам, я удалось найти через Интернет, этот полный вывод записывается в БД.
Мне интересно, какой смысл хранить эти первые символы вместе с остальной солью и зашифрованными данными. Их значение мне совершенно ясно, но я не могу понять, почему такая информация должна быть написана вместе с остальной частью хэша. Разве они не "просто" информация об алгоритме и адаптивной стоимости вычислений? Так какая польза от хранения такой информации, связанной с приложением? И (даже если это может звучать по-детски), зачем раскрывать их злоумышленнику, который может в конечном итоге захватить мою базу данных?
1 ответ
Причина в том, как работает крипта. Он разработан таким образом, чтобы вы могли сделать следующее
if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
//Verified
}
Таким образом, сохраняя все, вам не нужно каждый раз воссоздавать солонку...
И дело в соли не секрет. На самом деле, это не значит быть секретным. Это предназначено, чтобы помешать радужным столам. помните, что если они могут захватить вашу базу данных, высоки шансы, что они смогут получить и другие вещи, поэтому добавление соли в другое место на самом деле не даст вам много.
Кроме того, соль не очень поможет. BCrypt разработан, чтобы быть CPU-Hard, что означает, что грубое принуждение (даже при знании соли) нецелесообразно. Вот почему у вас есть параметр стоимости. Так что не беспокойтесь о "сокрытии" соли. Просто сохраните его рядом с паролем, и все будет в порядке...
Не говоря уже о том, что произойдет, если в будущем вы захотите настроить свой алгоритм? Например, допустим, вы хотите увеличить параметр стоимости за счет более качественного оборудования. Если вы не сохранили эту информацию с паролем, все ваши сохраненные пароли станут недействительными. Таким образом, каждый сохраненный пароль имеет всю информацию, необходимую для его проверки. Таким образом, при действительном входе в систему вы можете проверить, является ли хэш текущим значением по умолчанию, а если нет, перефразировать и обновить базу данных новой. Это предотвращает проблемы, связанные с обновлением и улучшением методов хеширования...