Le funzioni di hash spiegate
Una funzione di hash trasforma qualsiasi input in un’impronta breve e di lunghezza fissa. Questa guida spiega a cosa servono MD5, SHA-1 e SHA-256, quali sono i loro limiti e come confrontare un file con un checksum pubblicato.
Che cos’è un hash
Una funzione di hash crittografica legge dati di qualsiasi dimensione e produce un digest di lunghezza fissa: 128 bit per MD5, 160 bit per SHA-1 e 256 bit per SHA-256, di solito mostrato come testo esadecimale. Lo stesso input produce sempre lo stesso digest, e cambiare anche un solo bit dell’input produce un digest molto diverso. Un hash è unidirezionale: non puoi ricavare l’input dal digest, se non provando a indovinare gli input e confrontando i risultati.
Questa guida fornisce informazioni generali. Per le decisioni di sicurezza, segui i requisiti della tua organizzazione o del servizio con cui lavori.
Checksum e integrità
L’uso quotidiano più comune è verificare che un file sia arrivato integro. Una pagina di download può pubblicare un valore SHA-256 accanto al file. Dopo il download, calcoli l’hash della tua copia e lo confronti con quello pubblicato. Se i valori corrispondono, è molto probabile che il file sia identico a quello di cui l’editore ha calcolato l’hash; se differiscono, il download è danneggiato o il file è una versione diversa.
Un checksum è utile solo se il valore pubblicato è a sua volta attendibile. Se un malintenzionato può modificare sia il file sia il checksum sulla stessa pagina, un hash corrispondente dimostra poco. Le firme digitali risolvono questo problema.
Perché MD5 e SHA-1 non sono adatti alla sicurezza
Un hash sicuro dovrebbe rendere impraticabile trovare due input diversi con lo stesso digest (una collisione). Per MD5 e SHA-1 sono stati pubblicati attacchi di collisione praticabili, quindi un malintenzionato può preparare due file diversi con lo stesso hash. Per questo motivo non sono più considerati adatti a firme digitali, certificati o altri usi di sicurezza.
MD5 e SHA-1 possono ancora rilevare danneggiamenti accidentali, e alcuni sistemi meno recenti li pubblicano. Per i nuovi progetti la scelta abituale è SHA-256 o un altro membro della famiglia SHA-2 (SHA-384, SHA-512).
| Algoritmo | Lunghezza del digest | Stato di sicurezza |
|---|---|---|
| MD5 | 128 bit (32 caratteri esadecimali) | Vulnerabile alle collisioni; solo per checksum legacy |
| SHA-1 | 160 bit (40 caratteri esadecimali) | Vulnerabile alle collisioni; uso legacy |
| SHA-256 | 256 bit (64 caratteri esadecimali) | Ampiamente usato e consigliato |
| SHA-384 / SHA-512 | 384 / 512 bit | Ampiamente usati e consigliati |
L’hashing non è una crittografia, e le password richiedono di più
La crittografia è reversibile con la chiave giusta; l’hashing non è progettato per essere invertito. Un hash però non nasconde input brevi o prevedibili: chiunque può calcolare l’hash di parole comuni o numeri di telefono e cercare una corrispondenza.
Per questo gli hash veloci come MD5 o SHA-256 da soli non sono adatti a memorizzare password. Sono progettati per essere veloci, il che permette a un malintenzionato di provare molto rapidamente un numero enorme di tentativi. Per memorizzare le password si usano algoritmi lenti e con salt, creati appositamente, come Argon2, scrypt o bcrypt. Se realizzi un sistema di login, usa una libreria mantenuta e le indicazioni attuali per la tua piattaforma invece di un hash generico.
HMAC per l’autenticazione dei messaggi
Un semplice hash mostra se i dati sono cambiati, ma chiunque può ricalcolarlo. HMAC (hash-based message authentication code) combina i dati con una chiave segreta, ad esempio HMAC-SHA256. Solo chi conosce la chiave può produrre il valore corretto, quindi il destinatario può verificare che un messaggio provenga da chi possiede la chiave e non sia stato alterato. I webhook e la firma delle richieste API usano comunemente HMAC. Mantieni segreta la chiave: chiunque la possieda può creare codici validi.
Perché lo stesso testo produce un hash diverso
Un hash viene calcolato sui byte, non sul testo che vedi. Queste differenze cambiano il risultato:
- Fine riga: Windows usa CR LF, mentre Linux e macOS usano LF.
- Codifica dei caratteri: "é" corrisponde a byte diversi in UTF-8 e nelle codifiche più vecchie.
- Un a capo o uno spazio finale, oppure un byte order mark all’inizio di un file.
- Maiuscole o minuscole nell’input.
Quando un hash non corrisponde, controlla prima questi aspetti. Calcolare l’hash del file originale è di solito più affidabile che calcolarlo sul testo copiato da esso. L’output esadecimale in sé non distingue tra maiuscole e minuscole: A1B2 e a1b2 sono lo stesso valore.
Domande frequenti
Posso decifrare un hash MD5 o SHA-256?
No. Un hash non è un dato cifrato. I servizi online di "decifratura" cercano hash precalcolati di input comuni, ed è per questo che gli hash di valori semplici offrono poca protezione.
Quale algoritmo devo usare per verificare un download?
Usa quello fornito dall’editore. Se ne sono disponibili diversi, SHA-256 o SHA-512 sono una scelta migliore di MD5 o SHA-1.
Il Generatore di hash carica il mio file?
Il Generatore di hash di LeedyBox calcola gli hash nel browser, quindi il testo o il file che selezioni viene elaborato sul tuo dispositivo.