Hashing

Introduzione

La Hash facade di Laravel offre hashing sicuro con Bcrypt e Argon2 per memorizzare le password degli utenti. Se utilizzi uno dei starter kit per applicazioni Laravel, Bcrypt verrà usato di default per la registrazione e l’autenticazione.

Bcrypt è una scelta eccellente per l’hashing delle password perché il suo "work factor" è regolabile, il che significa che il tempo necessario per generare un hash può aumentare con l’aumentare della potenza hardware. Quando si hashano le password, la lentezza è positiva. Più un algoritmo impiega tempo per hashare una password, più tempo ci vuole agli utenti malintenzionati per creare "rainbow tables" di tutti i possibili valori hash delle stringhe che potrebbero essere usate in attacchi di forza bruta contro le applicazioni.

Configurazione

Per impostazione predefinita, Laravel utilizza il driver di hashing bcrypt per l’hashing dei dati. Tuttavia, sono supportati diversi altri driver di hashing, tra cui argon e argon2id.

Puoi specificare il driver di hashing della tua applicazione utilizzando la variabile d’ambiente HASH_DRIVER. Se invece vuoi personalizzare tutte le opzioni del driver di hashing di Laravel, dovresti pubblicare il file di configurazione completo hashing usando il comando Artisan config:publish:

php artisan config:publish hashing

Utilizzo di Base

Hash delle Password

Puoi creare un hash per una password chiamando il metodo make sul facade Hash:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PasswordController extends Controller
{
    /**
     * Aggiorna la password per l'utente.
     */
    public function update(Request $request): RedirectResponse
    {
        // Valida la lunghezza della nuova password...

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

        return redirect('/profile');
    }
}

Regolare il Fattore di Lavoro di Bcrypt

Se stai utilizzando l’algoritmo Bcrypt, il metodo make ti permette di gestire il fattore di lavoro dell’algoritmo usando l’opzione rounds; tuttavia, il fattore di lavoro predefinito gestito da Laravel è accettabile per la maggior parte delle applicazioni:

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

Regolare il Fattore di Lavoro di Argon2

Se stai usando l’algoritmo Argon2, il metodo make ti permette di gestire il fattore di lavoro dell’algoritmo utilizzando le opzioni memory, time e threads; tuttavia, i valori predefiniti gestiti da Laravel sono accettabili per la maggior parte delle applicazioni:

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

[!NOTE]
Per maggiori informazioni su queste opzioni, consulta la documentazione ufficiale di PHP relativa all’hashing Argon.

Verificare che una password corrisponda a un hash

Il metodo check fornito dalla facade Hash ti permette di verificare se una stringa in chiaro corrisponde a un determinato hash:

if (Hash::check('plain-text', $hashedPassword)) {
    // Le password corrispondono...
}

Determinare se una Password Deve essere Rihashata

Il metodo needsRehash fornito dalla façade Hash permette di verificare se il fattore di lavoro utilizzato dall’hashatore è cambiato da quando la password è stata hashata. Alcune applicazioni scelgono di eseguire questo controllo durante il processo di autenticazione dell’applicazione:

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

Verifica dell’Algoritmo di Hash

Per evitare la manipolazione dell’algoritmo di hash, il metodo Hash::check di Laravel verificherà prima che l’hash fornito sia stato generato usando l’algoritmo di hashing selezionato dall’applicazione. Se gli algoritmi sono diversi, verrà lanciata un’eccezione RuntimeException.

Questo comportamento è quello previsto per la maggior parte delle applicazioni, dove l’algoritmo di hashing non dovrebbe cambiare e algoritmi differenti possono indicare un attacco malevolo. Tuttavia, se hai bisogno di supportare più algoritmi di hashing nella tua applicazione, ad esempio quando migri da un algoritmo all’altro, puoi disabilitare la verifica dell’algoritmo di hash impostando la variabile di ambiente HASH_VERIFY su false:

HASH_VERIFY=false
Lascia un commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *