La crittografia raramente fallisce perché un algoritmo viene violato. Fallisce perché viene usata male. Gli stessi errori ricorrono da anni in applicazioni, siti, dispositivi e procedure aziendali, spesso commessi in buona fede da chi crede di aver protetto i dati. Conoscerli è il modo più semplice per non ripeterli.
1. Confondere codifica e cifratura
Base64, la codifica esadecimale o la compressione non sono cifratura. Trasformano i dati in un'altra rappresentazione, ma chiunque può tornare indietro senza alcuna chiave. Una password "nascosta" in Base64 in un file di configurazione è, a tutti gli effetti, una password in chiaro.
Cosa fare: se i dati devono restare riservati, usa un algoritmo di cifratura vero, con una chiave custodita separatamente.
2. Inventare un proprio algoritmo
È sorprendentemente comune trovare cifrature "fatte in casa": XOR con una parola fissa, sostituzioni di caratteri, combinazioni creative di algoritmi noti. Sembrano funzionare perché il risultato è illeggibile a occhio nudo, ma raramente resistono a un'analisi seria.
Cosa fare: usa algoritmi standard (AES, ChaCha20, Ed25519, X25519) attraverso librerie mature e ad alto livello, che offrono funzioni del tipo "cifra questo messaggio" senza costringerti a scegliere ogni dettaglio.
3. Usare la modalità ECB
Cifrare ogni blocco di dati indipendentemente, come fa la modalità ECB, lascia trasparire la struttura dell'originale: blocchi identici producono blocchi cifrati identici. L'esempio classico è un'immagine cifrata in ECB in cui i contorni della figura restano riconoscibili.
Cosa fare: usa modalità moderne e autenticate come AES-GCM o ChaCha20-Poly1305.
4. Cifrare senza autenticare
Una cifratura senza verifica d'integrità impedisce di leggere i dati, ma non impedisce di modificarli. In alcune modalità un attaccante può alterare bit precisi del testo cifrato e ottenere modifiche prevedibili nel testo decifrato, oppure sfruttare i messaggi d'errore del sistema per ricavare informazioni.
Cosa fare: preferisci la cifratura autenticata. Se devi combinare cifratura e codice di autenticazione separati, prima cifra e poi calcola l'autenticazione sul testo cifrato, e verificala prima di decifrare.
5. Riutilizzare un nonce
Molti algoritmi richiedono un valore unico per ogni operazione, chiamato nonce o vettore di inizializzazione. Con AES-GCM, riusare lo stesso nonce con la stessa chiave permette di ricavare informazioni sui messaggi e di falsificarne di nuovi. Con le firme ECDSA, un nonce ripetuto rivela la chiave privata.
Cosa fare: genera i nonce con un generatore casuale sicuro o con contatori gestiti correttamente, e lascia che sia la libreria a occuparsene quando possibile.
6. Usare numeri casuali deboli
Le funzioni casuali generiche dei linguaggi di programmazione sono pensate per simulazioni e giochi, non per la sicurezza: i loro valori possono essere previsti. Un caso storico è quello di una distribuzione Linux in cui, nel 2008, si scoprì che una modifica al codice di una libreria crittografica aveva ridotto drasticamente la casualità: per circa due anni le chiavi generate su quei sistemi appartenevano a un insieme piccolo e prevedibile.
Cosa fare: usa sempre il generatore crittografico del sistema operativo o della libreria.
7. Lasciare le chiavi accanto ai dati
Chiavi scritte nel codice sorgente, caricate nei repository, salvate nella stessa cartella dei backup cifrati o inviate nella stessa email del file protetto. In tutti questi casi la cifratura è solo una formalità.
Cosa fare: separa sempre chiavi e dati; usa gestori di segreti, portachiavi di sistema o moduli hardware.
8. Disattivare la verifica dei certificati
Durante lo sviluppo capita di disattivare il controllo dei certificati TLS per far funzionare un collegamento. Se quella impostazione arriva in produzione, la connessione resta cifrata ma non più autenticata: chiunque si interponga può presentarsi come il server.
Cosa fare: non disattivare mai la verifica; se usi certificati interni, aggiungi la tua autorità all'elenco di quelle fidate.
9. Proteggere le password con hash veloci
Salvare le password con MD5, SHA-1 o anche SHA-256 semplice consente a chi sottrae il database di provare enormi quantità di combinazioni in poco tempo.
Cosa fare: usa funzioni progettate per le password, come Argon2, scrypt o bcrypt, con sale unico per ogni utente.
10. Affidarsi alla segretezza del sistema
"Nessuno sa come funziona, quindi è sicuro" è un ragionamento che la storia della crittografia ha smentito più volte. Prima o poi il funzionamento viene scoperto, per esempio analizzando il software o il dispositivo.
Cosa fare: progetta in modo che la sicurezza dipenda solo dalla chiave.
Una tabella di riepilogo
| Errore | Alternativa |
|---|---|
| Base64 come protezione | Cifratura vera con chiave separata |
| Algoritmo fatto in casa | Libreria standard di alto livello |
| ECB, cifratura non autenticata | AES-GCM, ChaCha20-Poly1305 |
| Nonce ripetuti | Nonce unici gestiti dalla libreria |
| Casualità debole | Generatore crittografico del sistema |
| Chiavi nel codice | Gestore di segreti, HSM |
| Verifica TLS disattivata | Verifica sempre attiva |
| Hash veloci per le password | Argon2, scrypt, bcrypt |
In sintesi
- La maggior parte dei fallimenti crittografici nasce dall'uso scorretto, non da algoritmi violati.
- Codifica e offuscamento non sono cifratura; algoritmi fatti in casa vanno evitati.
- Modalità autenticate, nonce unici e casualità crittografica sono requisiti di base.
- Chiavi separate dai dati e verifica dei certificati sempre attiva sono irrinunciabili.
- Le password richiedono funzioni di hashing lente e con sale.