Cos'è un hash e perché è ovunque nella tecnologia?
Probabilmente hai visto stringhe come questa:
e3b0c44298fc1c149afbf4c8996fb924
27ae41e4649b934ca495991b7852b855
Appaiono nei download di software ("verifica l'hash SHA-256"), nelle conversazioni sulla blockchain, nelle discussioni sulla sicurezza delle password e in innumerevoli strumenti per sviluppatori. Ma cos'è effettivamente un hash, e perché è così fondamentale per la tecnologia moderna?
Il concetto in parole semplici
Una funzione hash prende qualsiasi input, una parola, una frase, un intero file, e produce un output di lunghezza fissa chiamato valore hash (detto anche digest, checksum o impronta digitale). Le proprietà chiave sono:
- Deterministico. Lo stesso input produce sempre lo stesso output.
- Lunghezza fissa. Indipendentemente dalla grandezza dell'input, l'output è sempre della stessa dimensione.
- Unidirezionale. Non puoi ricostruire l'input originale dall'output hash.
- Effetto valanga. Una piccola modifica nell'input produce un hash completamente diverso.
Pensalo come un'impronta digitale per i dati. Proprio come la tua impronta digitale ti identifica univocamente ma non può essere usata per ricostruire il tuo volto, un hash identifica univocamente un dato ma non può essere usato per ricostruire l'originale.
Un esempio semplice
Ecco cosa fa la funzione hash SHA-256 a due input molto simili:
| Input | Hash SHA-256 (primi 16 caratteri) |
|---|---|
| "Hello" | 185f8db32271fe25... |
| "hello" | 2cf24dba5fb0a30e... |
| "hello!" | ce06092fb948d9ff... |
Cambiare un singolo carattere (H maiuscola in h minuscola) o aggiungere un punto esclamativo produce un hash completamente diverso. Non c'è nessuno schema, nessuna relazione prevedibile. Questo è l'effetto valanga in azione.
Lo sapevi? L'hash SHA-256 di un input vuoto (letteralmente nulla) è e3b0c44298fc1c14.... Questa è una costante ben nota. Ogni implementazione SHA-256 al mondo produce esattamente lo stesso output per un input vuoto.
Algoritmi hash comuni
MD5
- Output: 128 bit (32 caratteri esadecimali)
- Stato: Compromesso per scopi di sicurezza. Le collisioni (input diversi che producono lo stesso hash) possono essere generate in pochi secondi.
- Ancora usato per: Controlli di integrità dei file dove la sicurezza non è un requisito (es. verificare che un download non sia stato corrotto).
SHA-1
- Output: 160 bit (40 caratteri esadecimali)
- Stato: Deprecato per la sicurezza. Le collisioni sono state dimostrate.
- Ancora usato per: Sistemi legacy, identificatori dei commit Git.
SHA-256
- Output: 256 bit (64 caratteri esadecimali)
- Stato: Standard attuale. Nessun attacco pratico conosciuto.
- Usato per: Memorizzazione password, firme digitali, blockchain, verifica file, certificati TLS.
SHA-512
- Output: 512 bit (128 caratteri esadecimali)
- Stato: Standard attuale. Margine di sicurezza ancora maggiore rispetto a SHA-256.
- Usato per: Applicazioni ad alta sicurezza, alcuni schemi di hashing delle password.
Attenzione MD5 e SHA-1 non dovrebbero mai essere usati per scopi di sicurezza (password, firme digitali, certificati). Sono crittograficamente compromessi. Usa SHA-256 o SHA-512 per qualsiasi cosa legata alla sicurezza.
Dove vengono usati gli hash
Memorizzazione delle password
Quando crei un account, il sito web non memorizza (o non dovrebbe) la tua password effettiva. Invece, memorizza l'hash della tua password. Quando accedi, il sistema calcola l'hash della password che inserisci e lo confronta con l'hash memorizzato. Se corrispondono, sei dentro.
Questo significa che anche se un database viene violato, gli attaccanti ottengono hash, non password. Non possono invertire l'hash per trovare la tua password (anche se possono provare a indovinarla calcolando l'hash di password comuni e confrontando).
L'hashing moderno delle password va oltre con algoritmi come bcrypt, scrypt e Argon2, che aggiungono un salt (dati casuali) e sono deliberatamente lenti per rendere il brute-force impraticabile.
Verifica dei file
Quando scarichi un software, il sito web spesso fornisce un hash SHA-256 del file. Dopo il download, calcoli l'hash del file tu stesso e confronti. Se gli hash corrispondono, il file è esattamente ciò che l'editore intendeva. Se differiscono, il file è stato corrotto o manomesso durante il download.
Atteso: a1b2c3d4e5f6...
Il tuo file: a1b2c3d4e5f6... ✓ Corrispondenza — file autentico
Blockchain e criptovalute
Ogni blocco in una blockchain contiene l'hash del blocco precedente, creando una catena indistruttibile. Se qualcuno tenta di alterare una transazione passata, l'hash di quel blocco cambia, rompendo la catena da quel punto in avanti, rendendo la manomissione immediatamente rilevabile.
Il mining di Bitcoin è essenzialmente una competizione per trovare un input che produce un hash SHA-256 che inizia con un certo numero di zeri.
Firme digitali
Quando firmi digitalmente un documento, non crittografi effettivamente l'intero documento con la tua chiave privata. Invece, il documento viene hashato e l'hash viene crittografato. Questo è molto più veloce e produce una firma compatta.
Deduplicazione dei dati
I servizi di cloud storage usano gli hash per rilevare file duplicati. Se due utenti caricano lo stesso file, ha lo stesso hash, e il servizio deve memorizzare solo una copia.
Controllo versione Git
Ogni commit, file e albero in Git è identificato dal suo hash SHA-1. Ecco come Git sa se un file è cambiato e come traccia l'intera cronologia di un progetto.
Lo sapevi? Git sta gradualmente migrando da SHA-1 a SHA-256. La transizione è iniziata perché le collisioni SHA-1 sono state dimostrate nel 2017, rendendo teoricamente possibile creare due commit diversi con lo stesso identificatore.
Il problema dell'irreversibilità (e perché è importante)
La natura unidirezionale degli hash è sia la loro forza più grande che una frequente fonte di confusione.
Non puoi "decrittare" un hash. Un hash non è crittografia. La crittografia è bidirezionale: crittografi con una chiave, decrittografi con una chiave. L'hashing è unidirezionale: puoi calcolare l'hash dall'input, ma non puoi calcolare l'input dall'hash.
L'unico modo per "invertire" un hash è indovinare l'input originale, calcolare l'hash della tua ipotesi e verificare se corrisponde. Per input brevi e semplici (come password comuni), questo è fattibile. Per input lunghi e casuali, è computazionalmente impossibile.
Ecco perché la lunghezza della password conta così tanto. L'hash di "password123" può essere trovato provando password comuni. L'hash di "j8#kL9$mN2@pQ5&" richiederebbe più tempo dell'età dell'universo per essere trovato per tentativi.
Provalo tu stesso
Il modo migliore per capire gli hash è sperimentare. Calcola l'hash di una parola, poi cambia un carattere e osserva come l'output cambia completamente. Calcola l'hash di un file prima e dopo una modifica e nota la differenza.
Suggerimento Genera e verifica hash per qualsiasi testo o file: Come generare e verificare gli hash. Prova SHA-256, MD5, SHA-512 e altro — istantaneamente, gratis, nel tuo browser.
Esplora gli hash in pratica:
Gratuito, istantaneo e senza registrazione.