Crittografia
Cifratura, codifica e hashing: che cosa fa ciascuno
Distingui codifica, cifratura e hashing con laboratori su Base64, SHA-256 e OpenSSL. Impara perché Base64 non protegge niente e perché gli hash sono unidirezionali.
La crittografia da zero: cifratura, chiavi, hash, firme e perché un cifrario di Cesare insegna i concetti ma non protegge nulla.
La crittografia è l'insieme dei metodi matematici usati per proteggere le informazioni. Questi metodi tengono privati i dati, mostrano quando sono stati modificati, confermano chi ha inviato un messaggio e permettono a due parti di fidarsi l'una dell'altra su una rete che non controllano. La usi ogni volta che un browser apre un sito HTTPS, quando un aggiornamento software è firmato o quando un sito controlla la tua password senza salvarla in chiaro.
La cifratura è uno degli strumenti della crittografia, e il campo è più ampio di così.
La cifratura prende il testo in chiaro e una chiave, li fa passare in un algoritmo e produce il testo cifrato. Chi ha la chiave giusta può invertire il processo. Chi non ce l'ha non dovrebbe ricavare nulla di utile dal testo cifrato.
Una serratura è un paragone utile. Il meccanismo è l'algoritmo, e la chiave è l'unico oggetto che la apre. Il paragone regge poco, perché una chiave software è un numero e non un pezzo di metallo. Separa comunque due cose che spesso si confondono: il metodo, che può essere pubblico, e il valore segreto, che deve restare privato.
Il principio di Kerckhoffs, formulato nell'Ottocento, dice che un sistema dovrebbe restare sicuro anche quando si conosce tutto tranne la chiave. I progetti crittografici moderni seguono questa regola. Se un progetto funziona solo finché l'algoritmo resta nascosto, trattalo con sospetto.
Con la cifratura simmetrica, una sola chiave segreta cifra e decifra. AES è il cifrario a blocchi simmetrico standard, specificato dal NIST nel FIPS 197. La cifratura simmetrica è veloce, quindi gestisce il grosso dei dati di un sistema. Il difficile è far avere a entrambe le parti la stessa chiave senza che un attaccante la veda.
Scegliere AES è solo la prima decisione. La modalità operativa, la gestione dei nonce e l'eventuale autenticazione del testo cifrato decidono tutte se il progetto è sicuro. "Usiamo AES" è un punto di partenza, non una spiegazione.
Con la crittografia asimmetrica, ogni parte ha una coppia di chiavi: una chiave pubblica che chiunque può vedere e una chiave privata che resta al suo proprietario. Gli schemi asimmetrici permettono a due parti di concordare un segreto condiviso su un canale aperto e a chi firma di dimostrare che possiede una chiave privata. TLS 1.3 usa operazioni asimmetriche nell'handshake per concordare le chiavi e controllare l'identità del server, poi passa alla cifratura simmetrica per i dati. La RFC 8446 descrive questo schema.
Una funzione di hash crittografica prende un input di qualsiasi lunghezza e restituisce un digest di lunghezza fissa. SHA-256, specificato nel FIPS 180-4, restituisce sempre 256 bit. Un buon hash rende impraticabile trovare due input con lo stesso digest e risalire all'input a partire dal digest. Non c'è nessuna chiave e nessun passaggio di decifratura.
Gli hash servono per i controlli di integrità. Se il digest di un file scaricato corrisponde al valore pubblicato dal vendor, molto probabilmente il file è quello pubblicato dal vendor. Gli hash compaiono anche nelle firme e in molti altri protocolli.
Per le password non basta un semplice hash. Una funzione veloce come SHA-256 permette a un attaccante di provare un numero enorme di tentativi al secondo con l'hardware adatto. L'OWASP Password Storage Cheat Sheet consiglia una funzione volutamente lenta e memory-hard come Argon2id, con un salt univoco per ogni password e parametri calibrati sul tuo hardware. La RFC 9106 definisce Argon2.
Base64 trasforma i dati binari in caratteri di testo perché possano attraversare sistemi che si aspettano testo. La trasformazione non richiede alcun segreto, quindi chiunque può invertirla. La codifica serve a rendere i dati trasportabili, non a nasconderli. Le tre idee risolvono problemi diversi:
Il cifrario di Cesare fa scorrere ogni lettera della stessa quantità. Con uno scorrimento di tre, A diventa D, H diventa K e così via. È un cifrario a sostituzione, e contiene già il vocabolario di base: testo in chiaro, chiave, testo cifrato e algoritmo.
Sui dati reali fallisce per un motivo semplice. L'alfabeto ha 26 lettere, quindi solo 25 scorrimenti cambiano il testo. Un computer li prova tutti all'istante, e una persona può provarli su carta. In un messaggio lungo, le frequenze delle lettere svelano lo scorrimento ancora più in fretta. Per questo il cifrario è un esercizio da aula e non una protezione.
I comandi qui sotto sono stati eseguiti in Git Bash su Windows 11, con i suoi tr, sha256sum e base64. Eseguili sulla tua macchina. Non incollare password reali o testi riservati in nessun sito web per provarli.
printf 'HELLO' | tr 'A-Z' 'D-ZA-C'Output:
KHOORInverti lo scorrimento:
printf 'KHOOR' | tr 'D-ZA-C' 'A-Z'Output:
HELLOprintf 'HELLO' | sha256sum | cut -d' ' -f1
printf 'HELLP' | sha256sum | cut -d' ' -f1Output:
3733cd977ff8eb18b987357e22ced99f46097f31ecb239e878ae63760e83e4d5
d37f1f826f924dcd23aacbdc875edd4808b9e118d35adb9dce1c80cb23c4a9c1Cambiare una lettera cambia l'intero digest. Nulla nell'output ti permette di risalire a HELLO. Per controllare un'ipotesi, calcoli l'hash dell'ipotesi e confronti il risultato.
printf 'HELLO' | base64Output:
SEVMTE8=Chiunque veda SEVMTE8= può decodificarlo. Trattalo come un formato, non come un segreto.
Comincia dagli obiettivi di base della sicurezza, riservatezza, integrità e disponibilità, con l'articolo sulle basi della sicurezza informatica. Poi leggi l'articolo sul cifrario di Cesare, che va più a fondo su sostituzione e analisi delle frequenze. Dopo studia l'hashing, le chiavi simmetriche e TLS, usando le fonti primarie elencate con questo articolo al posto dei riassunti.
Fai pratica sulla tua macchina, con dati sintetici, o in un lab tuo o che hai il permesso scritto di testare.
Crittografia
Distingui codifica, cifratura e hashing con laboratori su Base64, SHA-256 e OpenSSL. Impara perché Base64 non protegge niente e perché gli hash sono unidirezionali.
Crittografia
Perché gli hash veloci non vanno bene per le password, a cosa servono salt e work factor e come calcolare e verificare un hash con Argon2id in Python usando argon2-cffi.
Crittografia
Chiavi pubbliche e private da zero: cosa dimostra una firma, perché la chiave privata resta segreta e un lab con Ed25519 in cui un file modificato non passa la verifica.