Hashing e Integrità dei Dati: Funzioni Unidirezionali, Checksum, Collisioni e Salting delle Password

Tempo di lettura: 13 min

Quando scarichiamo un file di installazione da Internet, aggiorniamo il sistema operativo o digitiamo la nostra password per accedere a un social network, ci affidiamo a un meccanismo invisibile che lavora per noi in pochi millisecondi. Come fa il nostro computer a essere sicuro che il programma scaricato non sia stato manomesso da un hacker durante il download? E come fa un sito web a verificare che la nostra password sia esatta senza doverla salvare in chiaro nei propri archivi?

La risposta a entrambi i quesiti si basa su uno dei concetti matematici più affascinanti e diffusi dell’informatica: la funzione hash crittografica.

Spesso confuso impropriamente con la crittografia, l’hashing persegue uno scopo concettualmente diverso: non serve a "nascondere temporaneamente un messaggio per poi riaprirlo con una chiave", ma a generare una impronta digitale matematica indelebile e a senso unico. In questa guida didattica esploreremo come funzionano algoritmi come SHA-256, perché vecchie glorie come MD5 sono state abbandonate, come si calcola un checksum da riga di comando e come le tecniche di Salting e Argon2 difendono le nostre password da furti di massa.


L’Analogia del Frullatore e dell’Impronta Digitale

La distinzione tra cifratura e hashing è uno dei punti su cui gli studenti cadono più frequentemente. Per fissare il concetto in modo definitivo, ricorriamo all’analogia del frullatore:

Analogia Intuitiva
La Cassaforte con Chiave vs Il Frullatore da Cucina
  • La Crittografia (La Cassaforte a Due Vie): Prendi un documento, lo chiudi a chiave dentro una cassaforte (cifratura) e poi lo riapri usando la combinazione corretta (decifratura). È un processo bidirezionale reversibile: il documento originale torna esattamente intatto nelle tue mani.
  • L’Hashing (Il Frullatore a Senso Unico): Prendi carote, mele, zenzero e qualche cubetto di ghiaccio e li getti in un frullatore ad altissima velocità. Dopo dieci secondi ottieni un bicchiere di frullato arancione (l’Hash o Digest). Guardando il bicchiere, è fisicamente e logicamente impossibile invertire il processo: nessun inventore al mondo potrà “sfrullare” il succo per far ricomparire la mela intera o la carota intatta! Inoltre, se rifai la ricetta cambiando anche solo un minuscolo granello di pepe, il colore e il sapore del frullato cambieranno radicalmente (Effetto Valanga).

Le Proprietà Matematiche di una Funzione Hash Crittografica

Affinché un algoritmo di hash possa essere qualificato come crittograficamente sicuro (secondo gli standard del NIST), deve soddisfare rigorosamente sei proprietà matematiche:

  1. Determinismo Assoluto: Lo stesso identico testo in ingresso deve produrre sempre, in qualsiasi momento e su qualsiasi computer dell’universo, la medesima sequenza di output. Se immetti la parola "ciao" in SHA-256, otterrai sempre lo stesso risultato.
  2. Lunghezza dell’Output Fissa: Che tu passi in input una singola lettera "A", la Divina Commedia o un’immagine ISO di Windows da 5 Gigabyte, la funzione hash produrrà un’impronta di lunghezza rigorosamente identica: per SHA-256 sarà sempre lunga esattamente 256 bit (ovvero 64 caratteri esadecimali).
  3. Calcolo Rapido ed Efficiente: Il computer deve poter calcolare l’impronta di qualsiasi dato in tempi brevissimi (frazioni di millisecondo per file ordinari).
  4. Irreversibilità (Resistenza alla Preimmagine): Dato un hash $h$, deve essere computazionalmente impossibile per chiunque calcolare a ritroso il testo originale $m$ tale che $H(m) = h$.
  5. Resistenza alle Collisioni: Deve essere matematicamente impossibile trovare due file o messaggi differenti ($m_1 \neq m_2$) che producano per pura casualità la medesima impronta ($H(m_1) = H(m_2)$).
  6. Effetto Valanga (Avalanche Effect): Se modifichi anche un solo singolo bit nel file originale (ad esempio scambiando un punto con una virgola in un documento di mille pagine), l’impronta hash risultante deve stravolgersi completamente, cambiando mediamente oltre il 50% dei suoi bit.

Proprietà di Rigore: L'Effetto Valanga (Avalanche Effect) in SHA-256


L’Evoluzione degli Algoritmi: Da MD5 a SHA-3

Nel corso degli ultimi trent’anni, diverse funzioni di hash sono state create, celebrate e infine ritirate quando la potenza di calcolo ha iniziato a scalfirne la sicurezza:

1. MD5 (Message Digest 5) – OBSOLETO E PERICOLOSO

Creato nel 1991 dal celebre crittografo Ron Rivest (la "R" di RSA), generava impronte a 128 bit (32 caratteri esadecimali). Nel 2004, ricercatori cinesi guidati da Xiaoyun Wang hanno dimostrato come generare collisioni pratiche in pochi minuti: è possibile creare due programmi diversi (uno innocuo e uno contenente un trojan) che condividono lo stesso identico hash MD5. Non deve mai più essere usato per la sicurezza.

2. SHA-1 (Secure Hash Algorithm 1) – DEPRECATO

Sviluppato dalla NSA americana nel 1995 con digest a 160 bit. Nel 2017, un team congiunto di ricercatori di Google e del CWI di Amsterdam ha portato a compimento l’attacco SHAttered, producendo due file PDF con contenuti grafici diversi ma con il medesimo hash SHA-1. Lo standard è stato ufficialmente dismesso da tutti i browser e sistemi operativi moderni.

3. La Famiglia SHA-2 (Lo Standard Globale Attuale)

Pubblicata dal NIST nel 2001 (FIPS PUB 180-4), la famiglia SHA-2 include algoritmi solidissimi come SHA-256 e SHA-512.

  • SHA-256 offre uno spazio di indirizzamento pari a $2^{256}$ combinazioni possibili (circa $1,15 \times 10^{77}$).
  • Ad oggi non è mai stata scoperta alcuna collisione pratica o teorica contro SHA-256: è il pilastro che garantisce i certificati SSL/TLS mondiali, la sicurezza dei sistemi operativi e la validazione della blockchain di Bitcoin.

4. SHA-3 (Keccak): L’Architettura a Spugna

Vincitore di una severissima gara pubblica durata cinque anni indetta dal NIST, SHA-3 (FIPS 202) non si basa sull’architettura interna di SHA-2 (la struttura di Merkle-Damgård), ma su un paradigma matematico innovativo chiamato Costruzione a Spugna (Sponge Construction). Non è stato introdotto perché SHA-2 fosse debole, ma come "piano di riserva strategico mondiale" nel caso in cui in futuro venisse scoperta una vulnerabilità strutturale nella logica di SHA-2.

Algoritmo Lunghezza Digest Anno Introduzione Stato di Sicurezza Attuale Utilizzo Raccomandato
MD5 128 bit (16 byte) 1991 Totalmente Violato Solo checksum non critici contro errori casuali di disco
SHA-1 160 bit (20 byte) 1995 Violato (SHAttered 2017) Deprecato, da rimuovere ovunque
SHA-256 256 bit (32 byte) 2001 Massima Sicurezza Standard aureo per HTTPS, firme, blockchain, integrità file
SHA-512 512 bit (64 byte) 2001 Massima Sicurezza Sistemi a 64 bit ad altissime prestazioni, finanza, intelligence
SHA-3 (Keccak) 224 – 512 bit 2015 Massima Sicurezza Standard alternativo di sicurezza per future-proofing crittografico

Verificare l’Integrità dei File: Il Checksum nella Pratica

Quando scarichi un’immagine di installazione di Ubuntu Linux o un aggiornamento critico del BIOS per la scheda madre, il produttore mostra accanto al pulsante di download una stringa come:
SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Questo valore è il Checksum (Somma di Controllo). Se durante il download si verifica un micro-errore di trasmissione o se un hacker ha sostituito il file sul server con una versione infetta, l’hash ricalcolato sul tuo PC risulterà differente anche solo di una virgola.

Come Verificare il Checksum di un File da Riga di Comando

▪ Contenuto Dati

Su Windows (PowerShell / Terminale):
Get-FileHash -Algorithm SHA256 nome_file.iso
# Oppure con la storica utility nativa:
certutil -hashfile nome_file.iso SHA256

Su Linux e macOS (Terminale Bash / Zsh):
sha256sum nome_file.iso
# Su macOS:
shasum -a 256 nome_file.iso

Se la stringa alfanumerica a 64 caratteri restituita dal comando coincide esattamente con quella dichiarata dallo sviluppatore sul sito ufficiale, il file è integro al 100% e privo di corruzioni o manomissioni!

SU WINDOWS (PowerShell o Prompt dei Comandi):
certutil -hashfile ubuntu-24.04-desktop-amd64.iso SHA256

SU LINUX / MAC (Terminale Bash o Zsh):
sha256sum ubuntu-24.04-desktop-amd64.iso
  

Se la stringa restituita dal terminale corrisponde carattere per carattere a quella pubblicata sul sito ufficiale, hai la certezza matematica che il file sul tuo disco è integro e non alterato al 100%.


Come Salvare le Password: La Trappola dell’Hash Semplice e il Salting

Come fa un sito web serio a gestire le credenziali dei propri utenti?

  • Errore Criminale: Salvare le password in testo in chiaro (se il database viene bucato, tutti gli account sono persi all’istante).
  • Errore Ingenuo: Fare l’hash semplice della password con SHA-256: hash = SHA256(password).

Perché fare solo SHA256(password) è pericoloso? Perché gli hacker hanno pre-calcolato giganteschi archivi contenenti gli hash di miliardi di password comuni (dizionari e Rainbow Tables). Se la tua password è Password123!, l’hacker non deve violare SHA-256: gli basta cercare l’hash rubato nella sua tabella già pronta per scoprire in un decimo di secondo quale parola in chiaro lo ha generato!

Il Rimedio: Il Salting delle Password

Per neutralizzare per sempre le Rainbow Tables si applica il Salting (salatura):

Tecnica di Sicurezza
Come Funziona il Salt Crittografico
  1. Quando l’utente si registra e sceglie la password Segreto99, il server genera una stringa casuale lunga e imprevedibile chiamata Salt (es. x7$kL9#mP2).
  2. Il server concatena la password con il salt: Segreto99 + x7$kL9#mP2.
  3. Calcola l’hash della stringa combinata: hash_finale = HASH(password + salt).
  4. Nel database vengono salvati sia il Salt che l’Hash risultante (il salt non è un segreto, serve solo a rendere l’input unico al mondo).

In questo modo, anche se mille utenti sul sito usano la stessa password banale 123456, ognuno avrà un salt diverso e nel database compariranno mille hash completamente differenti tra loro. Le Rainbow Tables diventano totalmente inutili!


Perché SHA-256 NON Va Usato per le Password: La Necessità di Algoritmi Lenti

C’è un ultimo pericolo fondamentale: SHA-256 è stato progettato per essere estremamente veloce.
Un computer moderno dotato di schede video da gaming (GPU) o chip dedicati può calcolare oltre 10 miliardi di hash SHA-256 al secondo. Se un hacker ruba un database anche con password salate, può lanciare un attacco di forza bruta provando centinaia di miliardi di combinazioni in poche ore.

Per proteggere le password, gli ingegneri informatici usano algoritmi opposti: algoritmi lenti e avidi di risorse (Key Stretching & Memory-Hard Algorithms):

Evoluzione degli Algoritmi di Hashing per Password: Dai Primi Cifrari ad Argon2id

Storico MD5 & SHA-1

Algoritmi Obsoleti e Bucati: Concepiti per l'integrità dei file e troppo veloci. Vulnerabili ad attacchi di collisione e tabelle Rainbow precalcolate; craccabili in pochi millisecondi con schede video moderne.

RFC 2898 PBKDF2

Funzione a Più Iterazioni: Esegue decine o centinaia di migliaia di cicli consecutivi (es. 600.000 round di SHA-256 con salt casuale) per rallentare gli attacchi di forza bruta.

1999 bcrypt

Adattivo a Costo Regolabile: Basato sull'algoritmo Blowfish; consente di incrementare l'esponente di calcolo (work factor) all'aumentare della potenza dei processori nel tempo.

RFC 9106 Argon2id

Lo Standard Aureo Moderno (Memory-Hard): Vincitore assoluto della Password Hashing Competition. Non consuma solo tempo di calcolo CPU, ma richiede decine di megabyte di RAM per ogni singolo tentativo, rendendo inutilizzabili i cluster di GPU e chip ASIC degli aggressori.

Oggi, lo standard industriale raccomandato a livello globale per l’archiviazione sicura delle credenziali di accesso è Argon2id (o in alternativa bcrypt configurato con un adeguato fattore di costo).


Domande Frequenti (FAQ)

1. Posso usare l’hashing per proteggere un testo che devo rileggere in futuro?

No, assolutamente. L’hashing è una strada a senso unico a fondo cieco: dal digest generato non si può estrarre il messaggio originale. Se devi proteggere un file, un testo o una comunicazione con la possibilità di rileggerla in futuro, devi utilizzare la crittografia (simmetrica come AES o asimmetrica come RSA/ECC) e conservare con cura la relativa chiave di decifrazione.

2. Che cos’è una "collisione" hash e perché è considerata catastrofica?

Una collisione si verifica quando due file differenti producono per coincidenza matematica lo stesso identico hash. Se un algoritmo soffre di collisioni facili (come accaduto con MD5), un criminale può creare un contratto bancario legittimo e un secondo contratto truffaldino con clausole modificate a suo favore che producono la medesima impronta: una firma digitale apposta sul primo documento risulterà valida anche sul secondo, con effetti legali disastrosi.

3. Come fa Git a usare l’hashing per tracciare i file del codice?

Il sistema di controllo versione Git (ideato da Linus Torvalds) non memorizza le modifiche riga per riga in un database tradizionale: ogni volta che esegui un git commit, Git calcola l’hash crittografico (storicamente SHA-1, oggi migrabile a SHA-256) del contenuto di ciascun file e della struttura delle cartelle. I commit di Git formano un albero matematico (Merkle Tree): se qualcuno provasse a manomettere furtivamente una vecchia riga di codice risalente a tre anni prima, tutti gli hash a cascata fino all’ultimo commit risulterebbero invalidati all’istante.

4. Che differenza c’è tra un semplice Hash e un HMAC?

Un hash ordinario (come SHA256(messaggio)) garantisce solo che il messaggio non sia stato corrotto accidentalmente durante la trasmissione; non garantisce però l’autenticità del mittente, perché chiunque può ricalcolare un nuovo hash se modifica il testo. Un HMAC (Hash-based Message Authentication Code) combina il messaggio con una chiave segreta condivisa tra mittente e destinatario (HMAC = HASH(chiave + messaggio)). In questo modo il destinatario verifica non solo che il dato sia integro, ma che sia stato generato esclusivamente da chi conosce quella specifica chiave segreta.


Glossario Tecnico dei Termini Chiave

  • Funzione Hash: Algoritmo matematico deterministico che mappa dati di lunghezza arbitraria in una stringa di bit a lunghezza rigorosamente fissa.
  • Digest (Impronta): Il valore di output generato da una funzione hash a fronte di un determinato input.
  • Effetto Valanga (Avalanche Effect): Proprietà secondo cui la minima alterazione di un singolo bit in ingresso produce una variazione drastica e statisticamente imprevedibile dell’output.
  • Collisione: Evento in cui due input diversi producono lo stesso identico valore di hash.
  • Checksum: Impronta hash calcolata su un file per verificarne l’integrità strutturale contro errori di trasmissione o corruzioni hardware.
  • Rainbow Table: Tabella pre-calcolata contenente milioni di corrispondenze tra password comuni e relativi hash, utilizzata dagli attaccanti per invertire rapidamente gli hash semplici.
  • Salt: Sequenza di caratteri casuali generata univocamente per ciascun utente e aggiunta alla password prima dell’hashing per sventare le tabelle rainbow.
  • Argon2: Algoritmo di hashing per credenziali vincitore del Password Hashing Competition (PHC), caratterizzato da elevata resistenza hardware grazie all’uso intensivo di memoria RAM.

Fonti Ufficiali e Riferimenti Accademici

Lascia un contributo o commento

L'indirizzo email non verrà pubblicato.