Хешування

Вступ

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

Bcrypt є чудовим вибором для хешування паролів, оскільки його "фактор роботи" є налаштовуваним, що означає, що час, необхідний для генерації хешу, може бути збільшений у міру зростання потужності апаратного забезпечення. При хешуванні паролів повільність є перевагою. Чим довше алгоритм витрачає часу на хешування пароля, тим більше часу потрібно зловмисникам для створення "веселкових таблиць" всіх можливих значень хешу рядків, які можуть бути використані в атаках грубої сили проти застосунків.

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

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

Ви можете вказати драйвер хешування вашого застосунку, використовуючи змінну середовища HASH_DRIVER. Але, якщо ви хочете налаштувати всі параметри драйвера хешування Laravel, вам слід опублікувати повний файл конфігурації hashing, використовуючи команду 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; однак, стандартний фактор роботи, керований 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)) {
    // Паролі співпадають...
}

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

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

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

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

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

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

HASH_VERIFY=false