Можете ли вы помочь мне понять функцию солевого хеширования?

Я использую различные методы хэширования паролей, и я нашел учебник, который оставил меня немного сомнительным в некоторых моментах. В частности, мне просто хотелось бы, если бы вы могли подтвердить / объяснить несколько вещей. Например, я нашел следующую функцию. Теперь, если я хорошо понимаю, что это делает, он генерирует соль, которая в случае следующих значений:

$salt = sprintf("$2a$%02d$", $cost) . $salt; // if $cost = 10 and $salt 234, then it should output $2a$1002d$234? 

Во-вторых, пример аутентификации использует следующее сравнение:

 if ( crypt($password, $user->hash) === $user->hash ) 

и он утверждает, что «Хеширование пароля с его хешем, когда соль возвращает тот же хеш» – теперь я проверил документацию по php и, естественно, он утверждает то же самое, но я просто пытаюсь понять концепцию теоретически (я не люблю повторно использовать материал даже если я знаю, как использовать, если я не понимаю логику, лежащую в его основе).

Мой вопрос в том, почему crypt ($ password, $ hash) возвращает одно и то же значение хэш-значения $. Я просто хочу понять логику, стоящую за ней. Спасибо.

Solutions Collecting From Web of "Можете ли вы помочь мне понять функцию солевого хеширования?"

Функция склепа PHP будет упаковывать все атрибуты в 60-значную строку (для BCrypt).

 $2y$10$nOUIs5kJ7naTuTFkBy1veuK0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | | | hash-value = K0kSxUFXfuaOKdOKf9xYT0KKIGSJwFa | | | | | salt = nOUIs5kJ7naTuTFkBy1veu (22 characters) | | | cost-factor = 10 = 2^10 iterations | hash-algorithm = 2y = BCrypt 

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

Функции PHP password_hash () и password_verify () – это всего лишь обертки вокруг функции склепа и будут обрабатывать важнейшие части, такие как создание безопасной соли.

Возьмите код, который вы читаете. и выбросить его, сжечь, убить. Просто не используйте его.

У PHP есть действительно сильная сборка паролей: password_hash и password_verify

Это создаст соль для вас, поэтому вам не нужно их отслеживать.

Более правильный и правильный ответ можно найти здесь: Защищенный хэш и соль для паролей PHP