Laravel: Hash::check() возвращает ' true` для двух разных сообщений


Laravel: Hash::check() возвращает ' true` для двух разных сообщений

25.10.2020 07:54:05 Просмотров 12 Источник

Я наблюдал очень странное поведение с фасадом Laravel Hash, используя Hash::make() для создания дайджеста (с bcrypt) и сохранения его в базе данных. Например, обычный текст

AAMkAGEzN2EyZTg4LWRiNTUtNGIwYS04ZTA1LWE2Y2U5OTRjYjQ0ZgBGAAAAAACxCzc14g3eSoadAxaGpB3ABwCr5qkyxHH4QY9vHKr6u5IrAAAAAAENAACr5qkyxHH4QY9vHKr6u5IrAARi2BmGAAA=

дает $2y$10$fq6jvoNL/RShVKfNDy64EOGW0gLzd0GvfS.di16Z9LcCK7DpIHONK.

Теперь, при использовании Hash::check() с обычным текстом и дайджестом, упомянутым выше, возвращает true, конечно. Однако изменение одного символа в обычном тексте (например, замена последнего A на B) и проверка его на соответствие тому же дайджесту также возвращает true:

Hash::make()0

Исходя из моего понимания того, что делает хэширование, это не должно быть возможным, но это не похоже на столкновение, поскольку замена B на Hash::make()2 также дает true.

Я использую Laravel 8.0 с PHP 7.4.11.

Есть идеи, что я здесь делаю не так?

Обновление: Нашел эту подсказку в официальной документации PHP для Hash::make()4:

Внимание: использование PASSWORD_BCRYPT в качестве алгоритма приведет к усечению параметра пароля до максимальной длины 72 символов.

Затем я проверил это, и действительно, изменение любого из символов позади Hash::make()5 не изменяет результат, тогда как обмен, например, последнего Hash::make()6 на Hash::make()7 возвращает Hash::make()8 для Hash::check(). Длина строки составляет bcrypt0 символов, так что это может быть эффект усечения. Но почему? Это не упоминается в документации Laravel Hash. У меня есть несколько паролей длиной более 72 символов, так что на самом деле не имеет значения, как они заканчиваются?

В результате мне нужно использовать другую функцию Laravel для хэширования более длинных сообщений? Какой именно?

У вопроса есть решение - Посмотреть?

Ответы - Laravel: Hash::check() возвращает ' true` для двух разных сообщений / Laravel: Hash::check() returns `true` for two different messages

Rob Biermann

25.10.2020 08:32:37

Я провел некоторые исследования и пришел к такому выводу:

В официальных документах laravel они ссылаются на официальные документы php. Здесь у них есть раздел caution в password, говорящий:

Использование PASSWORD_BCRYPT в качестве алгоритма приведет к усечению параметра пароля до максимальной длины 72 символов.

Я проверил вашу веревку, и она имеет длину 152. Поэтому в вашем случае вам следует использовать другой алгоритм(вы можете установить его в config/hashing.php в driver) или убедиться, что входная строка содержит не более 72 символов.

Помочь в развитии проекта:
Закрыть X