PHP

Salvare Le Password

Gestione sicura delle password: perché non si devono mai salvare password in chiaro e come utilizzare le funzioni di hashing in PHP per proteggere i dati degli utenti.

Durata

50 minuti

Software

XAMPP (Apache, PHP), Browser Web, Visual Studio Code

La protezione delle password

Quando gestiamo un sistema informativo, la sicurezza delle credenziali è la nostra priorità assoluta. Una delle regole d'oro della sicurezza informatica è: mai salvare le password in chiaro nel database.

Perché non salvare in chiaro?

Se un malintenzionato riuscisse ad accedere al database (tramite SQL Injection o furto di backup), otterrebbe istantaneamente tutte le password degli utenti. Molti utenti usano la stessa password per diversi servizi; un furto di dati su un piccolo sito può compromettere l'intera vita digitale di una persona.

Utilizzo dell'Hashing per le password

Per proteggere le credenziali dobbiamo utilizzare l'Hashing. Un algoritmo di hashing prende un input (la password) e restituisce una stringa di lunghezza fissa (il digest) che è impossibile da invertire. Non esiste un comando "de-hash". Quando l'utente effettua il login, noi "hashiamo" la password inserita e confrontiamo il risultato con quello salvato nel database.

Funzioni PHP per l'hashing

PHP mette a disposizione funzioni native e sicure per gestire questo processo senza dover implementare algoritmi complessi manualmente:

Funzione Descrizione Utilizzo principale
password_hash() Crea un nuovo hash utilizzando un algoritmo forte (come BCRYPT). Gestisce automaticamente il salt. Fase di registrazione o cambio password.
password_verify() Verifica che la password fornita in chiaro corrisponda all'hash memorizzato. Fase di Login per autenticare l'utente.
password_needs_rehash() Controlla se l'hash memorizzato deve essere aggiornato perché gli standard di sicurezza sono cambiati. Manutenzione della sicurezza degli account nel tempo.

LABORATORIO

Hashing delle Password in PHP

In questo laboratorio impareremo a trasformare una password in un hash sicuro e a verificarne la validità.


1 Creazione del convertitore (Esercizio Guidato)

Creeremo un file chiamato hash_test.php che accetta una stringa e mostra come PHP la trasforma utilizzando l'algoritmo predefinito.


<?php
if (isset($_POST['password'])) {
    $pass_input = $_POST['password'];
    
    // Generiamo l'hash sicuro
    $hash_generato = password_hash($pass_input, PASSWORD_DEFAULT);
    
    echo "<div style='background: #e2e2e2; padding: 10px; margin-bottom: 20px;'>";
    echo "<b>Password in chiaro:</b> " . $pass_input . "<br>";
    echo "<b>Hash generato:</b> " . $hash_generato . "<br>";
    echo "<b>Lunghezza Hash:</b> " . strlen($hash_generato) . " caratteri";
    echo "</div>";
}
?>

<form method="POST">
    <label>Inserisci una password da testare:</label><br>
    <input type="text" name="password" required>
    <button type="submit">Genera Hash</button>
</form>

password_hash() è una funzione PHP che serve a creare un hash sicuro della password prima di salvarla nel database.

  • Un hash è una trasformazione irreversibile:
  • ➡️ non è possibile risalire alla password originale partendo dall’hash.
Questo è fondamentale per la sicurezza: le password non devono mai essere salvate in chiaro.


2 Simulazione di Login (Verifica dell'identità)

Utilizziamo password_verify() per confrontare un input con un hash esistente.


<?php
// Hash simulato di una password (es. "123456") salvata nel DB
$hash_nel_db = '$2y$10$8K1.pS.xXWp5.zE1V.uRbeL1vS9L0.p1.z.q7l5.b.e.r.i.c.u.m.'; 

if (isset($_POST['login_pass'])) {
    $tentativo_utente = $_POST['login_pass'];

    if (password_verify($tentativo_utente, $hash_nel_db)) {
        echo "<h3 style='color:green'>Accesso Consentito!</h3>";
    } else {
        echo "<h3 style='color:red'>Password Errata!</h3>";
    }
}
?>

<form method="POST">
    <label>Tenta il Login:</label><br>
    <input type="password" name="login_pass" required>
    <button type="submit">Accedi</button>
</form>

La funzione password_verify() in PHP è uno strumento fondamentale per verificare in modo sicuro una password inserita dall’utente durante la login. confronta:

  • la password in chiaro inserita dall’utente
  • l’hash della password salvato nel database
e restituisce:
  • true → se la password è corretta
  • false → se la password è errata


3 Esercizio: Il Portale Aziendale

Scenario: Un'azienda vi chiede di creare un piccolo script di "Registrazione Utente". Si deve:

  • Creare un form HTML che chieda Username, Password e verifica password.
  • Al click sul tasto "Registra", lo script deve generare l'hash della password.
  • Controlli da effettuare: Aggiungere tutti i controlli affinché la password sia sicura cioè abbia tutte le caratteristiche di sicurezza prima di essere inviata alla funzione di hash.

4 Rispondi alle Domande

  • Qual è il vantaggio principale di password_hash() rispetto al salvataggio in chiaro?
  • Perché usiamo password_verify() invece di un semplice confronto tra stringhe?
  • Cosa succede se ricarichi la pagina generatrice di hash con la stessa password? Perché l'hash cambia?





Sicurezza Informatica, PHP, Password Hashing, Laboratorio, B016, Classe Terza, XAMPP,