Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас

Хешування

Вступ

Фасад Hash у Laravel надає безпечне хешування Bcrypt та Argon2 для зберігання паролів користувачів. Якщо ви користуєтеся одним зі стартових наборів застосунку Laravel, для реєстрації та автентифікації за замовчуванням використовуватиметься Bcrypt.

Bcrypt - чудовий вибір для хешування паролів, бо його «фактор складності» (work factor) можна регулювати: час генерування хешу можна збільшувати в міру зростання потужності обладнання. Коли йдеться про хешування паролів, повільно - це добре. Що довше алгоритм хешує пароль, то більше часу потрібно зловмисникам, щоб згенерувати «райдужні таблиці» з усіма можливими хешами рядків, які використовують в атаках перебором на застосунки.

Конфігурація

За замовчуванням Laravel хешує дані драйвером bcrypt. Проте підтримуються й інші драйвери хешування, зокрема argon та argon2id.

Драйвер хешування вашого застосунку можна вказати через змінну оточення HASH_DRIVER. Але якщо ви хочете налаштувати всі опції драйверів хешування Laravel, опублікуйте повний конфігураційний файл hashing артизан-командою 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
{
    /**
     * Update the password for the user.
     */
    public function update(Request $request): RedirectResponse
    {
        // Validate the new password length...

        $request->user()->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();

        return redirect('/profile');
    }
}

Налаштування фактора складності Bcrypt

Якщо ви користуєтеся алгоритмом Bcrypt, метод make дозволяє керувати фактором складності алгоритму через опцію rounds; проте значення за замовчуванням, яке підтримує Laravel, прийнятне для більшості застосунків:

$hashed = Hash::make('password', [
    'rounds' => 12,
]);

Налаштування фактора складності Argon2

Якщо ви користуєтеся алгоритмом Argon2, метод make дозволяє керувати фактором складності алгоритму через опції memory, time та threads; проте значення за замовчуванням, які підтримує Laravel, прийнятні для більшості застосунків:

$hashed = Hash::make('password', [
    'memory' => 1024,
    'time' => 2,
    'threads' => 2,
]);

Докладніше про ці опції читайте в офіційній документації PHP щодо хешування Argon.

Перевірка відповідності пароля хешу

Метод check, який надає фасад Hash, дозволяє перевірити, чи відповідає заданий рядок відкритим текстом заданому хешу:

if (Hash::check('plain-text', $hashedPassword)) {
    // The passwords match...
}

Визначення потреби в перехешуванні пароля

Метод needsRehash, який надає фасад Hash, дозволяє визначити, чи змінився фактор складності хешувальника відтоді, як пароль було захешовано. Деякі застосунки виконують цю перевірку під час автентифікації:

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}

Перевірка алгоритму хешування

Щоб запобігти маніпуляціям з алгоритмом хешування, метод Hash::check у Laravel спершу перевіряє, чи було заданий хеш згенеровано обраним у застосунку алгоритмом хешування. Якщо алгоритми різні, буде кинуто виняток RuntimeException.

Саме такої поведінки очікують у більшості застосунків, де алгоритм хешування не має змінюватися, а інший алгоритм може свідчити про атаку зловмисника. Проте якщо вашому застосунку потрібно підтримувати кілька алгоритмів хешування - наприклад, під час переходу з одного алгоритму на інший, - ви можете вимкнути перевірку алгоритму, встановивши змінну оточення HASH_VERIFY у значення false:

HASH_VERIFY=false