#php #authentication #hash #laravel-4
#php #аутентификация #хэш #laravel-4
Вопрос:
Я пытаюсь аутентифицировать пользователя с помощью Auth::attempt()
метода, и он продолжает терпеть неудачу, поэтому в итоге я получил следующий код:
$arr = array();
$arr['verified'] = Hash::make('1234') . ' ; ' . Hash::make('1234');
return json_encode($arr);
и это результат:
{"verified":"$2y$10$V4yXBUcxealfLrzOE/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy ; $2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK/HAf6uZGGXTKcVh52qHS4m"}
Как вы можете видеть, первый хэш дает $2y$10$V4yXBUcxealfLrzOE/xAD.sJ8qpNhrMA6K6dENBBXYqaVx1zSETgy
, а второй хэш дает $2y$10$C9xpOWLTUyfy1KL.Y3Tot.KWADmQYFK/HAf6uZGGXTKcVh52qHS4m
Это не должно иметь ничего общего с базой данных, хотя при хранении у меня есть поле пароля из 60 символов.
Есть идеи?
Ответ №1:
Это прекрасно, а также то, как это должно работать. Laravel использует Bcrypt для хеширования и, следовательно, генерирует случайную соль в процессе хеширования. Соль будет частью хэша, поэтому вы получаете два разных результата.
Алгоритм veryfing автоматически учитывает соль. Этот метод делает использование радужных таблиц практически невозможным.
Это не ошибка, это дополнительная безопасность без каких-либо усилий.
Учитывая ваш пример, проверка обоих ваших хэшей вернет true:
<?php
$hash1 = Hash::make('1234'); // A hash is generated
$hash2 = Hash::make('1234'); // Another hash is generated that differs from the first one
var_dump(Hash::check('1234', $hash1) amp;amp; Hash::check('1234', $hash2));
Хотя $hash1
и $hash2
содержат разные хэши, сопоставление их с заданной базовой строкой будет равно true.
Сгенерированный хэш имеет длину 60 символов. Поэтому следует убедиться, что столбец, в котором хранится хэш, также имеет минимальный размер 60 символов
Комментарии:
1. Но мне нужно сохранить хэшированный пароль в базе данных, как мне с этим сравнить? потому что пароль не всегда будет
1234
. И как я могу использовать это сAuth::attempt()
помощью метода?2. @user3723418 — Случайная соль станет частью результирующего хэш-значения, эта соль извлекается из сохраненного хэш-значения для проверки введенного пароля, просто используйте
Hash::check()
это автоматически для вас.3. @user3723418 использование метода Auth::attempt() еще проще. Как только у вас будет хэшированная соль в вашей базе данных (предполагается правильная конструкция БД), laravel автоматически сверит ввод с полями в вашей базе данных. Если в базе данных есть поле пароля и ключ пароля в вашем массиве, который вы передаете
Auth::attempt()
методу, laravel автоматически проверит эти два значения с учетом хеширования, а затем выполнит обработку сеанса.4. Но я хэшировал пароль, скопировал его точно, поместил в базу данных, затем повторил попытку, используя тот же пароль, и это не удалось.
5. Ваше поле пароля содержит 60 символов в базе данных?