Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.
Будьте в курсе последних новостей!
Будьте в курсе последних новостей!

Хеширование

Введение

Фасад 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