Хранение хэширования bcrypt

Согласно PHP doc, соль bcrypt состоит из

"$ 2a $", двухзначный параметр стоимости, "$" и 22 цифры из алфавита "./0-9A-Za-z"

Итак, если я использую функцию crypt() для хэширования своих паролей, итоговый вывод включает в себя первые 7 символов ($ 2a $10 $, если 10 - параметр стоимости) как часть соли - и, согласно все примеры, которые я смог найти через Интернет, этот полный вывод записывается в db.

Мне интересно, в чем смысл хранения этих первых символов с остальной солью и зашифрованными данными. Их смысл полностью ясен для меня, но я не могу понять, почему такая информация должна быть написана вместе с остальной частью хэша. Разве это не "просто" информация об алгоритме и адаптивной стоимости вычислений? Итак, какая польза от хранения такой информации, связанной с приложением? И (даже если это может показаться ребяческим), почему они раскрывают их злоумышленнику, который может в конечном итоге захватить мою базу данных?

Ответ 1

Причина в том, что работает склеп. Он сконструирован так, что вы можете сделать следующее

if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
    //Verified
}

Итак, сохраняя все, вам не нужно каждый раз воссоздавать сольную строку...

И точка соли не должна быть секретной. На самом деле это не значит быть тайным. Это означало фольклорные столы. помните, что если они могут захватить вашу базу данных, шансы высоки, они могут получить и другие вещи, поэтому размещение соли в другом месте на самом деле не даст вам многого.

Кроме того, соль не поможет. BCrypt предназначен для CPU-Hard, что означает, что грубое форсирование (даже зная соль) нецелесообразно. Вот почему у вас есть параметр стоимости. Поэтому не беспокойтесь о "сокрытии" соли. Просто сохраните его рядом с паролем, и все будет хорошо...

Не говоря уже о том, что произойдет, если в будущем вы захотите настроить свой алгоритм? Например, допустим, вы хотите увеличить параметр стоимости из-за лучшего оборудования, которое будет установлено. Если вы не сохранили эту информацию с паролем, все ваши сохраненные пароли станут недействительными. Таким образом, каждый сохраненный пароль имеет всю информацию, необходимую для его проверки. Таким образом, вы можете проверить действующий логин, если хеш является текущим значением по умолчанию, а если не перефразировать и обновить базу данных новым. Он предотвращает проблемы, связанные с обновлением и улучшением методов хеширования...