Laravel 5: Использование bcrypt в одной строке дает разные значения

Я использую фреймворк Laravel по bcrypt функция для хэширования паролей. Когда я это сделаю,

bcrypt('secret')

Я

=> "y$mnPgYt2xm9pxb/c2I.SH.uuhgrOj4WajDQTJYssUbTjmPOcgQybcu"

но если я запущу его снова, я получу

=> "y$J8h.Xmf6muivJ4bDweUlcu/BaNzI2wlBiAcop30PbPoKa0kDaf9xi"

и так далее...

итак, не произойдет ли сбой процесса сопоставления паролей, Если я каждый раз получаю разные значения?

2 ответов


Это как bcrypt должен работать. См.Википедия.

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

процесс сопоставления паролей не завершится неудачей из-за различных значений хэшей. Попробуйте следующее tinker

$hash1 = bcrypt('secret')
$hash2 = bcrypt('secret')

Hash::check('secret', $hash1)
Hash::check('secret', $hash2)

вы должны true в обоих случаях Hash::check.

поэтому, даже если хэш-значения отличаются, сопоставление паролей не завершится ошибкой.


Bcrypt использует 128-битную соль и шифрует 192-битное магическое значение. Он использует преимущества дорогостоящей настройки ключа в eksblowfish.

алгоритм bcrypt выполняется в два этапа, как показано на рисунке 3. На первом этапе eksblowfishsetup вызывается со стоимостью, солью и паролем для инициализации состояния eksblowfish. Большая часть времени bcrypt тратится на дорогостоящий ключевой график. После этого 192-битное значение `OrpheanBeholderScryDoubt" шифруется 64 время использования eksblowfish в режиме ЕЦБ с состоянием с предыдущей фазы. Выход представляет собой стоимость и 128-битную соль, объединенную с результатом цикла шифрования.

enter image description here

Как это работает в laravel:

if (! function_exists('bcrypt')) {
    /**
     * Hash the given value against the bcrypt algorithm.
     *
     * @param  string  $value
     * @param  array  $options
     * @return string
     */
    function bcrypt($value, $options = [])
    {
        return app('hash')->driver('bcrypt')->make($value, $options);
    }
}

поддерживаемые параметры PASSWORD_BCRYPT:

соль (строка) - вручную предоставить соль для использования при хэшировании пароля. Обратите внимание, что это переопределит и предотвратите автоматическое создание соли.

если опущено, случайная соль будет генерироваться password_hash () для каждого хэшированного пароля. Это предполагаемый режим работы.

предупреждение опция salt устарела с PHP 7.0.0. Сейчас предпочли просто использовать соль, которая генерируется по умолчанию.

стоимость (целое число) - что обозначает алгоритмическую стоимость, которую следует использовать. Таких примеров значения можно найти на странице crypt ().

если опущено, будет использоваться значение по умолчанию 10. Это хорошая базовая стоимость, но вы можете рассмотреть возможность ее увеличения в зависимости от вашего оборудования.

Как работает шифрование и дешифрование Bcrypt:
Внутренне bcrypt() use использует встроенную функцию password_hash () PHP. функция password_hash() возвращает разные значения каждый раз, потому что он добавляет случайную строку ("соль") к паролю. Соль на самом деле содержится в выходном хэше.

если тот же пароль хэшируется с той же солью, вы всегда получите тот же результат. Поэтому password_verify () смотрит на сохраненный хэш, извлекает соль, а затем хэширует данный пароль с той же солью.