Vai al contenuto
HexaTransfer
Torna al blog
Crittografia e sicurezza

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") è sempre 2cf24dba5fb0a30e....
  • 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