Любите загадки? Событие еще доступно на сайте.
Примите наш вызов и улучшите свои навыки!
Примите наш вызов и улучшите свои навыки!

Хеширование

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 12.x. Почему это важно?

Введение

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