Funzioni hash spiegate: verificare l'integrità dei file
Le funzioni hash sono essenziali per verificare l'integrità dopo il trasferimento. Come SHA-256 e MD5 garantiscono file intatti.
Una funzione hash prende qualsiasi input e produce un output di dimensioni fisse — SHA-256 produce sempre esattamente 256 bit (32 byte) indipendentemente che l'input sia un tweet o un video da 10 GB. Cambia un bit dell'input e circa metà dei bit dell'output cambiano. Questa proprietà unidirezionale e deterministica rende gli hash lo strumento predefinito per verificare l'integrità dei file: calcola SHA-256(file) prima di inviare, calcolalo di nuovo dopo aver ricevuto, e se gli hash corrispondono il file è arrivato intatto. È come le distribuzioni Linux verificano i download ISO, come Git identifica i commit, e come servizi come HexaTransfer confermano che gli upload da più gigabyte siano completi senza corruzione.
Cosa garantisce una funzione hash
Tre proprietà definiscono una funzione hash crittografica:
- Deterministica. Lo stesso input produce sempre lo stesso output.
SHA-256("hello")è sempre2cf24dba5fb0a30e.... - Resistenza alla preimmagine. Dato un hash, non puoi trovare efficientemente un input che lo produca.
- Resistenza alle collisioni. Non puoi trovare efficientemente due input diversi che producano lo stesso hash.
Più due comportamenti utili:
- Effetto valanga. Cambiare un bit dell'input cambia circa il 50% dei bit dell'output. Rende gli hash inutili per la ricerca ma ottimi per il fingerprinting.
- Output di dimensioni fisse. SHA-256 è 32 byte, SHA-512 è 64 byte, BLAKE2b è 64 byte, indipendentemente dalla dimensione dell'input.
Gli hash non sono cifratura. Sono unidirezionali — non puoi recuperare l'input dall'output. Questo è il punto.
La famiglia SHA
La famiglia Secure Hash Algorithm, standardizzata dal NIST in FIPS 180-4 e FIPS 202:
- SHA-1 — 160 bit, rotto dall'attacco SHAttered di Google nel 2017. Non usarlo per la sicurezza.
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512). Il cavallo da lavoro dei sistemi moderni. SHA-256 domina.
- SHA-3 (Keccak). Costruzione diversa (sponge, non Merkle-Damgård), standardizzata nel 2015 come copertura contro le debolezze di SHA-2 che non si sono materializzate.
SHA-256 è ciò che firmano i certificati TLS, ciò che mina Bitcoin, ciò che usa Git (con una transizione pianificata a SHA-256 ancora in corso) e ciò che i servizi di trasferimento file calcolano per i controlli di integrità. Throughput sui CPU moderni con estensioni SHA: 2–4 GB/s per core.
Perché MD5 e SHA-1 sono morti per la sicurezza
MD5 (1991) produce hash a 128 bit ed era lo standard fino a quando le collisioni sono state dimostrate nel 2004. Nel 2012, il malware Flame ha falsificato i certificati di firma del codice Microsoft usando un attacco di collisione MD5. Oggi puoi generare collisioni MD5 in secondi su un laptop.
SHA-1 è durato più a lungo ma è caduto all'attacco SHAttered di Google nel 2017, che ha prodotto due PDF con hash SHA-1 identici dopo 110 GPU-anni di calcolo — ora riproducibile per meno di $100.000 su GPU cloud.
Entrambi sono ancora validi per usi non di sicurezza: rilevare corruzione accidentale, deduplicare storage, effettuare il fingerprinting delle chiavi cache. Non sono validi per firme digitali, verifica delle password, o qualsiasi cosa dove un aggressore beneficia dal falsificare una corrispondenza.
BLAKE2 e BLAKE3: velocità incontra sicurezza
BLAKE2 (2012) e BLAKE3 (2020) offrono una sicurezza a livello SHA-3 a 2–10x la velocità di SHA-256. BLAKE3 raggiunge circa 6 GB/s single-threaded e parallelizza linearmente su più core — una macchina a 16 core può raggiungere 100+ GB/s.
L'adozione sta crescendo: WireGuard usa BLAKE2s per l'autenticazione, Zcash usa BLAKE2b, e b3sum sta diventando un comune sostituto di sha256sum negli strumenti per sviluppatori. I servizi di trasferimento file che elaborano upload da più gigabyte usano sempre più BLAKE3 per evitare che il calcolo dell'hash diventi il collo di bottiglia.
I browser non espongono ancora BLAKE3 tramite la Web Crypto API, quindi le implementazioni JavaScript si affidano al codice di riferimento compilato in WASM a circa 500 MB/s nel browser.
Hash nei flussi di lavoro di trasferimento file
Diversi punti dove gli hash guadagnano il loro posto:
- Controllo di integrità post-upload. Il client calcola SHA-256 durante l'upload, il server calcola all'arrivo, le discrepanze attivano un re-upload. S3 usa MD5 per questo poiché la velocità conta più della resistenza alle collisioni contro la corruzione passiva.
- Verifica dell'upload a chunk. I file di grandi dimensioni vengono divisi in chunk da 4 MB o 5 MB; ogni chunk ottiene un hash, e un albero di hash (albero di Merkle) produce un hash radice unico per l'intero file.
- Deduplicazione. Se due utenti caricano lo stesso file, gli hash corrispondono, lo storage memorizza una volta sola. Usato dalla deduplicazione a livello di blocco di Dropbox e dalla cache CDN.
- Verifica del download. Alcuni servizi mostrano SHA-256 sulla pagina di download affinché i destinatari possano verificare.
- Identificazione della versione. Git usa SHA-1 (in migrazione a SHA-256) per gli ID dei commit — il contenuto di un file determina la sua identità.
L'estensione HMAC
Gli hash semplici possono verificare l'integrità ma non l'autenticità — chiunque può calcolare SHA-256(file). Aggiungere una chiave segreta trasforma un hash in un Message Authentication Code (MAC): solo chi ha la chiave può produrre o verificare il MAC.
HMAC (RFC 2104) è la costruzione standard: HMAC(chiave, msg) = SHA-256(chiave' ⊕ opad || SHA-256(chiave' ⊕ ipad || msg)). Usato in TLS 1.2, JWT firmati con HS256, firma delle richieste AWS e molti schemi di session cookie.
Per il trasferimento file, HMAC appare nel tag di autenticazione di AES-GCM (che usa GHASH, non HMAC, ma svolge lo stesso ruolo) e nella firma delle richieste API di alcuni servizi.
Alberi di Merkle: hash su larga scala
Per file molto grandi o raccolte di file, fare l'hash dell'intera cosa ogni volta è dispendioso. Un albero di Merkle dispone gli hash in un albero binario: le foglie sono gli hash dei chunk, i nodi interni sono gli hash dei loro figli, l'hash radice rappresenta l'intero set di dati.
Vantaggi:
- Aggiornamenti efficienti. Cambiare un chunk richiede solo di rifare l'hash di log(n) nodi.
- Prova di inclusione. Puoi provare che un chunk specifico fa parte della radice con solo log(n) hash fratelli.
- Calcolo parallelo. I rami fanno l'hash indipendentemente.
Usato da BitTorrent (post-v2), indirizzamento dei contenuti IPFS, oggetti tree di Git, log di trasparenza dei certificati e radici delle transazioni blockchain. I servizi di trasferimento file usano alberi di Merkle per gli upload ripristinabili dove gli upload parziali devono essere verificati rispetto all'originale.
Password e hash
Un'applicazione degli hash: trasformare le password in valori sicuri da memorizzare. Il semplice SHA-256(password) è insufficiente — le GPU farm calcolano miliardi di SHA-256 al secondo, quindi qualsiasi password comune cade istantaneamente.
Gli hash specifici per le password aggiungono un costo computazionale:
- PBKDF2-HMAC-SHA-256 con 600.000 iterazioni (OWASP 2023).
- bcrypt con fattore di costo 12 (circa 250 ms per hash).
- scrypt con memory hardness per resistere alle GPU.
- Argon2id — migliore pratica attuale, memory-hard e resistente alla parallelizzazione.
L'obiettivo non è la sicurezza attraverso l'hash stesso — è rendere ogni tentativo abbastanza costoso da rendere il brute force offline impraticabile per qualsiasi cosa tranne le password deboli.
Verificare un download a mano
Qualsiasi file che ti interessa può essere verificato con strumenti da riga di comando. Su macOS o Linux:
shasum -a 256 ubuntu-24.04.iso
Su Windows PowerShell:
Get-FileHash ubuntu-24.04.iso -Algorithm SHA256
Confronta l'output con l'hash pubblicato su ubuntu.com. Se corrispondono, il file è stato scaricato intatto e corrisponde a ciò che Canonical ha firmato. Se differiscono, o il download si è corrotto o qualcuno ha sostituito il file.
Per massima fiducia, verifica la firma sul file hash stesso usando GPG e la chiave di firma di Canonical. La catena a più passi — file hash firmato → hash del file → file — è il modo in cui le distribuzioni Linux hanno mantenuto la fiducia per decenni.
Come controllare la gestione dell'integrità di un servizio di trasferimento
Quattro domande da porre a qualsiasi fornitore di trasferimento file:
- Quale algoritmo hash usi per verificare gli upload? (SHA-256 o BLAKE3 vanno bene; MD5 è tollerabile solo per i controlli di corruzione; il silenzio è un segnale d'allarme.)
- Mostri l'hash al destinatario? (Non tutti lo fanno, ma è utile.)
- Per gli upload a chunk, verifichi con un albero di Merkle?
- C'è un modo per confrontare gli hash tra endpoint?
SwissTransfer, Tresorit, Proton Drive e HexaTransfer calcolano tutti SHA-256 durante il trasferimento e verificano all'arrivo. I fallimenti di integrità attivano un re-upload automatico dei chunk interessati anziché far fallire l'intero trasferimento.
Come mettere tutto in pratica
Per il tuo prossimo trasferimento sensibile: calcola shasum -a 256 file.pdf prima dell'upload, salva l'hash, e fai fare lo stesso al destinatario dopo il download. Hash corrispondenti provano l'integrità byte per byte. Sono 30 secondi di lavoro che rilevano corruzione, manomissione e i CDN mal configurati.
Provalo su hexatransfer.com — gratis, senza registrazione, fino a 10 GB.
Invia file di grandi dimensioni in modo sicuro con crittografia end-to-end
Trasferisci file fino a 10 GB gratuitamente con crittografia end-to-end. Nessun account necessario. I tuoi file vengono crittografati nel browser prima del caricamento — nessun altro può leggerli.
Invia un file