Vai al contenuto
New

DeepSeek V4.1 Flash free for 7 days: 10M tokens a day after a top-up of $10 or more. Until Nov 30.

How it works

Che cos'è la crittografia? Cifratura, chiavi, hash ed esempi quotidiani

La crittografia da zero: cifratura, chiavi, hash, firme e perché un cifrario di Cesare insegna i concetti ma non protegge nulla.

Base5 min di letturaDi NotHoly

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 rende illeggibili i dati leggibili

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.

Cifratura simmetrica e asimmetrica

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.

L'hashing non è cifratura

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.

La codifica non è cifratura

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:

  • La codifica cambia il formato, e chiunque può invertirla.
  • La cifratura nasconde il contenuto, e solo chi ha la chiave può invertirla.
  • L'hashing produce un'impronta del contenuto, e non è pensato per essere invertito.

Il cifrario di Cesare: una buona lezione, una pessima serratura

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.

Fai scorrere un messaggio avanti e indietro

bash
printf 'HELLO' | tr 'A-Z' 'D-ZA-C'

Output:

text
KHOOR

Inverti lo scorrimento:

bash
printf 'KHOOR' | tr 'D-ZA-C' 'A-Z'

Output:

text
HELLO

Guarda come reagisce un hash a una lettera cambiata

bash
printf 'HELLO' | sha256sum | cut -d' ' -f1
printf 'HELLP' | sha256sum | cut -d' ' -f1

Output:

text
3733cd977ff8eb18b987357e22ced99f46097f31ecb239e878ae63760e83e4d5
d37f1f826f924dcd23aacbdc875edd4808b9e118d35adb9dce1c80cb23c4a9c1

Cambiare 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.

Codifica senza cifrare

bash
printf 'HELLO' | base64

Output:

text
SEVMTE8=

Chiunque veda SEVMTE8= può decodificarlo. Trattalo come un formato, non come un segreto.

Errori comuni

  • Chiamare "cifrati" dei dati codificati. Base64 non dà alcuna riservatezza.
  • Trattare un hash come un contenitore reversibile. Un hash non può restituirti la password originale. Puoi solo confrontarlo con dei candidati.
  • Salvare le password con un hash veloce, o senza salt.
  • Scrivere un proprio cifrario o protocollo. Usa librerie ben revisionate e protocolli standard, e segui le loro indicazioni su modalità e parametri.
  • Dare per scontato che la cifratura basti da sola a mettere al sicuro i dati. La conservazione delle chiavi, il controllo degli accessi e il software intorno al cifrario spesso decidono l'esito.

Che cosa imparare dopo

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.

Fonti

  1. NIST Cryptography glossary
  2. NIST Encryption glossary
  3. FIPS 197, Advanced Encryption Standard (AES)
  4. FIPS 180-4, Secure Hash Standard (SHS)
  5. RFC 8446, The Transport Layer Security (TLS) Protocol Version 1.3
  6. RFC 9106, Argon2 Memory-Hard Function for Password Hashing and Other Applications
  7. OWASP Password Storage Cheat Sheet
  8. MDN Web Docs: Base64 (glossary)

Altro su Crittografia

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.

Base10 min di lettura

Crittografia

Password e hashing con Argon2id

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.

Intermedio10 min di lettura