- Utilizzare strategie di protezione dei dati e delle informazioni.
- Applicare protocolli e tecniche di sicurezza informatica nei contesti di sviluppo software.
- Progettare e implementare script lato server per la gestione sicura delle credenziali.
- Essere consapevoli della responsabilità etica e legale nel trattamento dei dati sensibili.
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à.
- XAMPP (Modulo Apache attivo)
- Editor di testo (VS Code)
- Cartella di lavoro:
C:\xampp\htdocs\sicurezza\
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.
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
- 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?