Причина в том, как работает крипта. Он спроектирован так, что вы можете сделать следующее
if ($hashedPassword == crypt($rawPassword, $hashedPassword)) {
//Verified
}
Так что, сохраняя все, вам не нужно каждый раз воссоздавать солонку ...
И смысл соли не должен быть секретом. На самом деле, это не значит быть секретным. Это предназначено, чтобы помешать радужным столам. помните, что если они смогут захватить вашу базу данных, высоки шансы, что они смогут получить и другие вещи, поэтому добавление соли в другое место на самом деле не даст вам много.
Кроме того, соль не сильно поможет. BCrypt разработан, чтобы быть CPU-Hard, что означает, что грубое принуждение (даже при знании соли) нецелесообразно. Вот почему у вас есть параметр cost . Так что не беспокойтесь о «сокрытии» соли. Просто храните его рядом с паролем, и все будет в порядке ...
Не говоря уже о том, что произойдет, если в будущем вы захотите настроить свой алгоритм? Например, допустим, вы хотите увеличить параметр стоимости за счет более качественного оборудования. Если вы не сохранили эту информацию с паролем, все ваши сохраненные пароли станут недействительными. Таким образом, каждый сохраненный пароль имеет всю информацию, необходимую для его проверки. Таким образом, вы можете проверить действительный вход в систему, если хэш является текущим значением по умолчанию, а если нет, перефразировать и обновить базу данных новой. Это предотвращает проблемы, связанные с обновлением и улучшением методов хеширования ...