Я добавил хеш-функцию для регистратора в Laravel 5, используя хеш-функцию php:
$password = $data['password'];
$salt = uniqid(mt_rand(), true);
$saltpass = $password.$salt;
$hashed = hash('sha256', $saltpass, false);
$b_hashed = bcrypt($hashed);
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => $b_hashed,
'salt' => $salt,
]);
Эта функция регистрации сработала, окончательный пароль ($ b_hashed) и соль сохранены в базе данных. Однако проблема заключается в логине. Я попытался хэшировать пароль ввода пользователя с сохраненной солью, а затем передать его в учетные данные в функции postLogin в AthenticatesAndRegistersUsers.php, но он не работает. Вот код:
{
$request->only('email', 'password');
$record = \DB::table('users')->where('email', $credentials['email']->get();
$record = $record[0];
$pass = $credentials['password'];
$salt = $record->salt;
$pass = $pass.$salt;
$hashed = hash("sha256", $pass, false);
$credentials = array(
'email' => $email,
'password' => $hashed);
$this->validate($request, [
'email' => 'required|email', 'password' => 'required',
]);
if ($this->auth->attempt($credentials, $request->has('remember')))
{
return redirect()->intended($this->redirectPath());
}
return redirect($this->loginPath())
->withInput($request->only('email', 'remember'))
->withErrors([
'email' => $this->getFailedLoginMessage(),
]);
}
Если вы намерены добавить дополнительную безопасность, есть лучшие способы улучшить схему, они бы защищали от точно определенных угроз. Laravel уже использует BCrypt по умолчанию, это должно быть хорошо для большинства целей.
Это оставляет в секрете схему, только злоумышленник, который знает, что SHA-256 использовался до вычисления хеша BCrypt, может успешно взломать пароли. Другими словами, ему нужен доступ к серверу для чтения кода (если вы не создаете фреймворк, код которого в любом случае известен).
Чтобы добавить секрет на стороне сервера, вам лучше вычислить хеш BCrypt, а затем зашифровать (двусторонний) хеш с помощью надежного ключа на стороне сервера. Таким образом, ключ является секретом (а не схемой), и вы можете обменять его при необходимости. Я описал это более подробно в моем руководство о безопасном хранении паролей.
Других решений пока нет …