Хеширование
Введение
Фасад Hash
фреймворка Laravel обеспечивает безопасное хеширование Bcrypt и Argon2 для хранения паролей пользователей. Если вы используете каркас одного из стартовых комплектов приложений Laravel, то для регистрации и аутентификации по умолчанию будет использоваться Bcrypt.
Bcrypt – отличный выбор для хеширования паролей, потому что его «коэффициент работы» регулируется, а это означает, что время, необходимое для генерации хеш-кода, может быть увеличено по мере увеличения мощности оборудования. При хешировании паролей – чем медленнее, тем лучше. Чем больше времени требуется алгоритму для хеширования пароля, тем больше времени требуется злоумышленникам для создания «радужных таблиц» всех возможных строковых хеш-значений, которые могут использоваться в атаках.
Конфигурирование
По умолчанию Laravel использует драйвер bcrypt
при хешировании данных. Однако поддерживаются несколько других драйверов хеширования, в том числе argon
и argon2id
.
Вы можете указать драйвер хеширования вашего приложения, используя переменную среды HASH_DRIVER
. Но если вы хотите настроить все параметры драйвера хеширования Laravel, вам следует опубликовать полный файл конфигурации хеширования с помощью Artisan-команды config:publish
:
php artisan config:publish hashing
Основы использования
Хеширование паролей
Вы можете хешировать пароль, вызвав метод make
фасада Hash
:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* Обновить пароль пользователя.
*/
public function update(Request $request): RedirectResponse
{
// Проверить длину нового пароля ...
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
return redirect('/profile');
}
}
Регулировка коэффициента работы Bcrypt
Если вы используете алгоритм Bcrypt, метод make
позволяет вам управлять коэффициентом работы алгоритма с помощью параметра rounds
; однако значение по умолчанию приемлемо для большинства приложений:
$hashed = Hash::make('password', [
'rounds' => 12,
]);
Регулировка коэффициента работы Argon2
Если вы используете алгоритм Argon2, метод make
позволяет вам управлять коэффициентом работы алгоритма с помощью параметров memory
, time
и threads
; однако значения по умолчанию приемлемы для большинства приложений:
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
Дополнительную информацию об этих параметрах можно найти в официальной документации PHP.
Проверка совпадения пароля с хешем
Метод check
фасада Hash
позволяет проверить, что указанная текстовая строка соответствует заданному хешу:
if (Hash::check('plain-text', $hashedPassword)) {
// Пароли совпадают ...
}
Определение необходимости повторного хеширования пароля
Метод needsRehash
фасада Hash
позволяет определить, изменился ли коэффициентом работы, используемый хешером, с момента хеширования пароля. Некоторые приложения предпочитают выполнять эту проверку во время процесса аутентификации приложения:
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}
Проверка алгоритма хеширования
Чтобы предотвратить манипуляции с алгоритмом хеширования, метод Laravel Hash::check
сначала проверяет, что данный хэш был сгенерирован с использованием выбранного алгоритма хеширования приложения. Если алгоритмы разные, будет выброшено исключение RuntimeException
.
Это ожидаемое поведение для большинства приложений, где не ожидается изменения алгоритма хеширования, а разные алгоритмы могут указывать на злонамеренную атаку. Однако если вам необходимо поддерживать несколько алгоритмов хеширования в вашем приложении, например, при переходе от одного алгоритма к другому, вы можете отключить проверку алгоритма хеширования, установив для переменной среды HASH_VERIFY
значение false
:
HASH_VERIFY=false