Una funzione di hash trasforma qualsiasi input in un'impronta di lunghezza fissa. Lo stesso input dà sempre lo stesso risultato, e cambiare un solo bit lo stravolge. Questo strumento calcola MD5, SHA-1, SHA-256, SHA-384 e SHA-512 — ma quale ti serva dipende interamente da cosa stai cercando di dimostrare.
L'hash va in una direzione sola, ed è quello il punto
A differenza della codifica o della cifratura, l'hash non ha un'inversa. Non esiste chiave che riporti un digest SHA-256 al file da cui è nato, perché il digest è di 32 byte sia che l'input fosse una parola sia un gigabyte: la maggior parte dell'informazione semplicemente non c'è più. Quando un sito dichiara di "decriptare" un hash MD5, sta cercando quel valore in una tabella di hash precalcolati di input comuni. Funziona con "password123" e fallisce con qualsiasi cosa imprevedibile.
È proprio questa proprietà a rendere gli hash utili per il confronto. Puoi dimostrare che due file sono identici, o che un download non si è corrotto, senza mai maneggiare i file insieme.
MD5 e SHA-1 sono rotti — per certi scopi
Entrambi sono rotti in un senso preciso: la resistenza alle collisioni. Una collisione sono due input diversi che producono lo stesso digest, e per MD5 un attaccante ne costruisce una in pochi secondi su un portatile. SHA-1 è caduto nel 2017, quando dei ricercatori hanno prodotto due PDF diversi con lo stesso digest, e nel 2020 le collisioni a prefisso scelto l'hanno reso attaccabile in pratica. Se un hash deve dimostrare che un documento è il documento che hai firmato, nessuno dei due è all'altezza.
Non sono però inutili. Controllare che un file sia sopravvissuto intatto a un trasferimento di rete è una domanda sulla corruzione accidentale, non su un avversario malintenzionato, e MD5 ci risponde benissimo: è per questo che parecchi strumenti emettono ancora checksum MD5. La regola è semplice: se a un attaccante conviene far collidere due input, ti serve SHA-256. Se nessuno ti sta attaccando e vuoi solo accorgerti di un bit girato, MD5 è veloce e sufficiente.
Non usarli mai per le password
È l'errore che trasforma una fuga di dati in una catastrofe. SHA-256 è progettato per essere veloce: l'hardware moderno ne calcola miliardi al secondo. Quella velocità è un pregio per i checksum e un difetto fatale per le password, perché è esattamente ciò che vuole un attaccante che ha in mano la tua tabella di hash trafugata. Aggiungere un salt blocca le rainbow table precalcolate ma non fa nulla contro la velocità pura.
Per le password serve una funzione deliberatamente lenta e affamata di memoria: bcrypt, scrypt o Argon2. Hanno un parametro di costo regolabile che ti permette di rendere costoso ogni tentativo, e Argon2 in più pretende molta memoria per ostacolare gli attacchi su GPU. Se stai cercando un hash per conservare una password, nessuno degli algoritmi di questa pagina è la risposta giusta.
Perché MD5 funziona qui ma non è nell'API del browser
Gli algoritmi SHA di questa pagina passano dalla Web Crypto API integrata nel browser. MD5 no, perché Web Crypto si rifiuta deliberatamente di implementarlo: l'ente di standardizzazione ha scelto di non mettere in mano agli sviluppatori una primitiva rotta. Quindi qui MD5 è calcolato da JavaScript scritto apposta.
Una conseguenza da conoscere: Web Crypto è disponibile solo in un contesto sicuro. Su HTTP in chiaro e a un indirizzo diverso da localhost, crypto.subtle è undefined e le opzioni SHA semplicemente non possono funzionare, mentre MD5 continua a girare. Se ti capita uno strumento di hash dove MD5 funziona e SHA-256 non fa nulla, il motivo è quasi certamente questo.
Domande frequenti
Il mio input viene inviato a un server?
No. Questo strumento è marcato "client": il digest è calcolato nella scheda del tuo browser e l'input non lascia mai la macchina. Vale la pena dirlo chiaramente perché all'hash si ricorre spesso con materiale sensibile — ma se l'input è davvero sensibile, usa uno strumento controllato dalla tua organizzazione invece di una qualsiasi pagina web gratuita, questa compresa.
Posso risalire al testo originale da un hash?
No, e nessuno strumento può. Quello che i siti "reverse MD5" fanno davvero è cercare il tuo digest in un dizionario di hash precalcolati. Se il tuo input era una parola comune o una password trafugata lo troveranno all'istante; se era qualcosa di imprevedibile non troveranno niente. L'hash in sé non contiene nessuna strada per tornare indietro.
Quale dovrei usare?
SHA-256, salvo un motivo specifico per non farlo. È abbastanza veloce per qualsiasi uso interattivo, non ha attacchi pratici, ed è quello che il resto dell'ecosistema si aspetta. Usa MD5 solo quando qualcos'altro lo impone — un file di checksum esistente, un'API legacy — e mai per qualcosa che a un attaccante convenga rompere.
Perché lo stesso testo dà un hash diverso dal mio server?
Quasi sempre è una differenza in cosa viene passato all'hash, non in come. Il colpevole classico è l'a capo finale: echo ne aggiunge uno, quindi echo "abc" | md5sum calcola l'hash di quattro byte, non tre. L'altro è la codifica dei caratteri: lo stesso testo visibile in UTF-8 e in UTF-16 è una sequenza di byte diversa e quindi un digest diverso. Gli hash non hanno nessuna tolleranza per "input quasi uguale".
Un hash più lungo è più sicuro?
Solo contro la forza bruta, e SHA-256 la mette già fuori portata di parecchio. SHA-512 non è significativamente più sicuro di SHA-256 per l'uso ordinario: su hardware a 64 bit è spesso leggermente più veloce, che è il motivo più comune per sceglierlo. La lunghezza non è l'asse che conta; conta se l'algoritmo ha attacchi noti.