Il tuo login è sicuro? E lo scambio di dati con l'API? Se non sai distinguere AES da RSA e quando usare SHA-256, la risposta è no. Noi di Meteora Web lo vediamo tutti i giorni: backend che conservano password in MD5, API che scambiano token senza firma, config con chiavi hardcoded. Non è malevolenza, è ignoranza pratica. E in un'epoca in cui l'AI trova zero-day in massa (ne abbiamo parlato qui), non conoscere le basi della crittografia è un lusso che nessuna PMI può permettersi.
Questa guida è per chi già scrive codice e vuole capire una volta per tutte differenze, casi d'uso e implementazioni reali di crittografia simmetrica, asimmetrica e hash functions. Niente teoria astratta: comandi, codici, scelte concrete.
Crittografia Simmetrica: il bullone della porta
Immagina di chiudere la porta di casa con un lucchetto. La stessa chiave apre e chiude. Questo è il principio della crittografia simmetrica: una sola chiave segreta viene usata sia per cifrare che per decifrare. È veloce, efficiente, adatta a grandi volumi di dati. Il problema? Come fai a condividere quella chiave con chi deve decifrare, senza che nessun altro la intercetti?
AES (Advanced Encryption Standard) è lo standard attuale. Noi lo usiamo in modalità GCM (Galois/Counter Mode) perché fornisce autenticazione integrata: se qualcuno manomette il ciphertext, lo scopri. Non usare mai ECB — è insicuro.
Esempio pratico: cifrare un file con OpenSSL
# Cifrare con AES-256-GCM (richiede chiave derivata da password) openssl enc -aes-256-gcm -pbkdf2 -iter 100000 -in dati.txt -out dati.enc -k 'miaPasswordForte'Attenzione: GCM produce un tag di autenticazione di 16 byte. Se non lo verifichi in decifratura, perdi la protezione da manomissione.
Dove si usa in produzione:
- Cifratura di dati a riposo (database, backup)
- VPN (IPsec, WireGuard)
- Cifratura di dischi (LUKS, BitLocker)
- Sessione TLS dopo lo scambio di chiavi asimmetrico
Il tallone d'Achille: lo scambio della chiave
Hai una chiave segreta. Devi inviarla al tuo collega a Roma. Se la mandi in chiaro, chiunque intercetti la connessione la legge. Se la cifri con un'altra chiave, ricrei lo stesso problema. Ecco perché serve la crittografia asimmetrica.
Crittografia Asimmetrica: la cassetta delle lettere
Una cassetta delle lettere ha una fessura pubblica (tutti possono infilare una busta) e una chiave privata (solo il postino apre). La crittografia asimmetrica usa due chiavi matematicamente collegate: una pubblica (cifra) e una privata (decifra). Così non devi mai condividere la chiave privata.
RSA è stato il primo algoritmo diffuso, basato sulla fattorizzazione di numeri primi grandi. Oggi si preferisce ECC (Elliptic Curve Cryptography) perché offre sicurezza equivalente con chiavi molto più corte (256 bit ECC ≈ 3072 bit RSA). Per firme digitali, Ed25519 è la scelta moderna: performante, sicura, implementazione semplice.
Generare una coppia di chiavi SSH (Ed25519)
ssh-keygen -t ed25519 -C "tuo@email.com"Questo crea due file: id_ed25519 (privata) e id_ed25519.pub (pubblica). Con la pubblica autorizzi l'accesso al server. Con la privata ti autentichi. Nessuna connessione via password.
Cifrare un messaggio con la chiave pubblica (RSA):
# Genera chiave privata RSA openssl genpkey -algorithm RSA -out rsa_priv.pem -pkeyopt rsa_keygen_bits:4096 # Estrai pubblica openssl rsa -pubout -in rsa_priv.pem -out rsa_pub.pem # Cifra echo "Dati sensibili" | openssl pkeyutl -encrypt -pubin -inkey rsa_pub.pem -out ciphertext.bin # Decifra openssl pkeyutl -decrypt -in ciphertext.bin -inkey rsa_priv.pemAttenzione: RSA non può cifrare più della lunghezza della chiave. Per messaggi lunghi si usa un ibrido: cifratura simmetrica con chiave effimera, e la chiave simmetrica viene cifrata con la chiave pubblica. Questo è esattamente come funziona TLS (HTTPS).
Dove si usa in produzione:
- HTTPS (handshake TLS)
- Firma digitale di software, documenti PDF, email (S/MIME, PGP)
- Autenticazione SSH, GPG
- Scambio di chiavi simmetriche (Diffie-Hellman su curve ellittiche)
Hash Functions: l'impronta digitale
Una funzione di hash produce una stringa di lunghezza fissa (es. 256 bit) a partire da un input arbitrario. È una strada a senso unico: non puoi risalire all'input dal hash. Due input diversi quasi certamente producono hash diversi (proprietà di collisione).
SHA-256 è lo standard attuale (della famiglia SHA-2). Non usare più MD5 o SHA-1 — sono rotti. Per password, non usare hash semplici: servono funzioni lente e con sale.
Hash di un file per verifica integrità
sha256sum file.zipIl risultato è un hash. Se scarichi lo stesso file da un sito ufficiale, confronti gli hash. Se coincidono, il file non è stato manomesso.
Hash di password: bcrypt, Argon2
Hashing una password con SHA-256 è istantaneo. Un attaccante con GPU prova miliardi di tentativi al secondo. La soluzione: funzioni key derivation lente e con sale (salt casuale per ogni utente).
import bcrypt password = b"miaPassword". salt = bcrypt.gensalt(rounds=12) # costo 2^12 iterazioni hash = bcrypt.hashpw(password, salt) print(hash) # b'$2b$12$...'Argon2 è vincitore del PHC e moderno: resistente a GPU e ASIC. In Python con argon2-cffi:
from argon2 import PasswordHasher ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4) hash = ph.hash("miaPassword") ph.verify(hash, "miaPassword") # TrueDove si usa in produzione:
- Archiviazione sicura delle password (bcrypt, Argon2, scrypt)
- Integrità dei messaggi (HMAC)
- Riconoscimento file duplicati
- Merkle tree (blockchain, Git)
- Generazione di indirizzi (Bitcoin)
Mettere tutto insieme: un esempio TLS reale
Quando visiti un sito HTTPS (ad esempio il nostro su Meteora Web), avviene questo mix:
1. Il tuo browser ottiene la chiave pubblica del server (certificato X.509 firmato).
2. Genera una chiave simmetrica temporanea (session key).
3. Cifra la session key con la chiave pubblica del server (asimmetrica).
4. Il server decifra con la propria chiave privata.
5. Da quel momento, tutta la comunicazione è cifrata simmetricamente (AES-GCM) — veloce e sicura.
6. Inoltre, un hash (SHA-256) viene usato per HMAC nell'autenticazione dei messaggi.
Questo è il motivo per cui non serve cifrare tutto con RSA: l'asimmetrico gestisce lo scambio della chiave, il simmetrico gestisce il carico. Ibrido.
Errori comuni da evitare
- Usare ECB mode in AES — è deterministico, due blocchi uguali danno lo stesso ciphertext. Usa GCM o CBC con IV casuale.
- Non verificare il tag di autenticazione in GCM — l'attaccante può modificare il ciphertext all'insaputa.
- Conservare le chiavi private nel repository Git — mai. Usa vault o variabili d'ambiente.
- Usare hash veloci (MD5, SHA-1, plain SHA-256) per password — usa bcrypt/Argon2 con salt e costo alto.
- Ignorare le curve ellittiche — per nuove implementazioni preferisci Ed25519 o X25519 rispetto a RSA.
Cosa fare adesso
- Controlla il tuo stack attuale: quali funzioni di hash usi per le password? Se non è Argon2 o bcrypt, cambia subito. Costo minimo: 12 rounds bcrypt o 3 secondi su Argon2.
- Implementa una rotazione delle chiavi: le chiavi private scadono. Pianifica un meccanismo di rotazione automatica.
- Usa HTTPS sempre: anche in ambiente di sviluppo. Configura certificati Let's Encrypt con rinnovo automatico.
- Aggiungi firma digitale ai tuoi aggiornamenti software: anche una semplice app web può beneficiare di checksum firmati.
- Studia una libreria standard: in Python impara
cryptography; in PHPsodium; in Nodenode:crypto. Non reinventare la crittografia.
Noi di Meteora Web abbiamo visto troppi progetti fallire per errori banali di crittografia. Capire la differenza tra simmetrica, asimmetrica e hash non è un esercizio accademico: è la base per costruire software che tenga conto della sicurezza dei clienti. E in un mondo dove il divario digitale è anche geografico, garantire sicurezza di serie A a chiunque è una responsabilità che ci prendiamo.
Sponsored Protocol