Hash dei file: MD5, SHA-1, SHA-256 e come verificare i download
Un hash di un file è un valore a lunghezza fissa calcolato dal contenuto di un file, comunemente usato per confrontare un file scaricato con una copia di riferimento. Gli stessi byte e algoritmo producono lo stesso risultato, ma teoricamente file diversi possono condividere lo stesso hash. Per la verifica di routine dei file, preferisci SHA-256 quando il fornitore lo fornisce e verifica da dove proviene il valore di riferimento.
Cosa rappresenta un hash di file?
Una funzione di hash calcola un riepilogo chiamato valore hash o digest. MD5, SHA-1 e SHA-256 hanno ciascuno una lunghezza di output fissa: un piccolo documento e un grande programma di installazione producono digest della stessa lunghezza quando si utilizza lo stesso algoritmo. Un digest non è una copia compressa da cui si può ricostruire il file. guida del NIST agli algoritmi e alla loro resistenza agli attacchi spiega queste proprietà e i requisiti di sicurezza rilevanti.
Gli strumenti ordinari di hashing dei file leggono i byte all'interno di un file, piuttosto che il suo nome o la posizione nella cartella. Rinominare un file senza cambiarne il contenuto mantiene invariato l'hash. Al contrario, due documenti che mostrano lo stesso testo possono contenere byte diversi a causa di terminazioni di riga, codifica dei caratteri o metadati memorizzati all'interno del file.
Un hash può essere descritto come un'impronta digitale, ma non è un identificatore assolutamente unico. Si verifica una collisione quando input diversi producono lo stesso digest. Un hash crittografico sicuro è progettato per rendere impraticabile trovare tali input. MD5 e SHA-1 non soddisfano più i requisiti di sicurezza per applicazioni resistenti alle collisioni.
MD5 vs SHA-1 vs SHA-256
MD5 sta per Message-Digest Algorithm 5; SHA sta per Secure Hash Algorithm. SHA-256 appartiene alla famiglia SHA-2 e produce 256 bit. Gli strumenti mostrano comunemente il risultato come testo esadecimale. Ogni carattere esadecimale rappresenta quattro bit, dando le seguenti lunghezze:
| Algoritmo | Dimensione del digest | Lunghezza esadecimale | Scelta per la verifica dei file |
|---|---|---|---|
| MD5 | 128 bit · 16 byte | 32 caratteri | Può essere necessario per confrontare un checksum legacy, ma non dovrebbe essere utilizzato per stabilire protezione contro manomissioni dannose. |
| SHA-1 | 160 bit · 20 byte | 40 caratteri | Può essere confrontato con riferimenti legacy; evitare di sceglierlo per nuove applicazioni di sicurezza. |
| SHA-256 | 256 bit · 32 byte | 64 caratteri | Una scelta pratica per controlli di integrità dei download di routine quando il fornitore fornisce un valore SHA-256. |
Le limitazioni di sicurezza e di resistenza alle collisioni di MD5 sono discusse in considerazioni sulla sicurezza di MD5 nella RFC 6151. Le specifiche SHA appaiono in Secure Hash Standard del NIST. Rilevare un errore di trasmissione accidentale e difendersi da un attaccante in grado di modificare un file sono requisiti diversi.
Confronta sempre gli hash dello stesso algoritmo. Un valore SHA-256 calcolato localmente non può essere verificato rispetto a un valore MD5 pubblicato. Inoltre, un output di 256 bit non implica una resistenza di 256 bit contro ogni tipo di attacco. Vedi guida del NIST agli algoritmi e alla loro resistenza agli attacchi per le limitazioni di SHA-1 e le differenze tra i tipi di attacco.
Cosa succede quando un carattere cambia?
Questo esempio in Python calcola SHA-256 per i byte ASCII abc e abC. Cambia solo l'ultimo carattere e nessuno dei due input include una nuova linea finale. L'output mostrato è stato verificato con Python 3.12; entrambi i digest contengono 64 caratteri esadecimali.
import hashlib
for data in (b"abc", b"abC"):
print(data.decode("ascii") + ": " + hashlib.sha256(data).hexdigest())
Output:
abc: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
abC: 0a2432a1e349d8fdb9bfca91bba9e9f2836990fe937193d84deef26c6f3b8f76
Questi input dall'aspetto simile producono digest molto diversi. L'esempio non dimostra che ogni coppia di input diversi debba avere hash differenti. L'output deterministico per lo stesso input, le possibili collisioni e la resistenza ad attacchi deliberati sono proprietà separate.
Come verificare un file scaricato
La verifica dell'integrità controlla se i dati differiscono da un riferimento. Calcolare un nuovo digest da solo non è una verifica: è necessario un hash di riferimento affidabile con cui confrontarlo.
- Ottieni l'hash di riferimento dalla pagina di download ufficiale del produttore o da un altro canale di distribuzione affidabile.
- Verifica che il sistema operativo, l'architettura della CPU, la versione e il nome del file corrispondano a quelli del download. Controlla quale algoritmo usa il riferimento.
- Attendi il completamento del download, quindi calcola il suo hash con lo stesso algoritmo. Non modificare né sovrascrivere il file mentre viene letto.
- Per SHA-256, confronta tutti e 64 i caratteri esadecimali, piuttosto che solo l'inizio. Le lettere esadecimali maiuscole e minuscole rappresentano gli stessi valori.
- Se i valori differiscono, non eseguire né installare il file. Ricontrolla il bersaglio del confronto, quindi scaricalo di nuovo dal canale ufficiale e ripeti la verifica.
Se un attaccante può sostituire sia un file che il suo hash di riferimento, valori corrispondenti non stabiliscono chi lo ha fornito. Una corrispondenza è un confronto con i dati di riferimento, non una prova che un file sia privo di malware. Quando sono forniti checksum firmati o firme digitali, segui le istruzioni dell'editore e verificane l'autenticità usando una chiave pubblica attendibile.
Comandi SHA-256 per Windows, Linux e macOS
example.iso qui sotto è un nome di file illustrativo. Sostituiscilo e il percorso con il tuo download effettivo e metti tra virgolette i percorsi contenenti spazi. Questi comandi leggono il file per calcolarne il digest; non ne modificano il contenuto.
Windows: Get-FileHash in PowerShell
Apri PowerShell dal menu Start ed esegui il seguente comando. -LiteralPath tratta il percorso letteralmente invece di interpretare i caratteri jolly. -Algorithm SHA256 seleziona esplicitamente l'algoritmo.
Get-FileHash -LiteralPath 'C:\Downloads\example.iso' -Algorithm SHA256 | Format-List
Controlla i campi Algorithm, Hash e Path. SHA-256 è il predefinito, ma specificarlo rende il confronto più chiaro. La documentazione di Microsoft su Get-FileHash descrive gli algoritmi supportati e l'output. Se il file non può essere trovato, verifica il suo percorso effettivo e l'estensione in Esplora file.
Linux: sha256sum
In un ambiente con GNU Coreutils sha256sum installato, apri un terminale ed esegui questo comando. L'output usuale include il digest seguito dal nome del file.
sha256sum "/home/user/Downloads/example.iso"
Se l'editore fornisce un file SHA256SUMS in formato GNU, posizionalo accanto ai file da verificare, apri un terminale in quella cartella e controlla l'elenco con il comando sottostante. I percorsi indicati nell'elenco devono esistere. Un elenco completo potrebbe segnalare file mancanti se hai scaricato solo alcune delle sue voci.
sha256sum --check SHA256SUMS
Le voci corrispondenti vengono segnalate come OK; le discrepanze vengono segnalate come errori. Anche l'elenco dei checksum deve provenire da una fonte affidabile. Consulta il manuale utilità SHA-2 di GNU per il comando e le opzioni di verifica. Se il comando manca, verifica se Coreutils è installato per la tua distribuzione.
macOS: shasum
Se shasum è disponibile nel tuo terminale, seleziona esplicitamente SHA-256 con -a 256. Senza quell'opzione, shasum utilizza di default SHA-1, il che può causare una discrepanza nell'algoritmo.
shasum -a 256 "/Users/user/Downloads/example.iso"
Per una lista di checksum compatibile, usa shasum -a 256 -c SHA256SUMS. La documentazione del mantenitore di shasum spiega la selezione dell'algoritmo e -c. Queste istruzioni per macOS si basano sulla documentazione dello strumento piuttosto che su un'esecuzione su macOS; il metodo Python sottostante è un'alternativa quando lo strumento non è disponibile.
Calcola SHA-256 di un file grande con Python
Con Python 3 installato, puoi usare il modulo hashlib della libreria standard. Salva questo codice come hash-file.py. Apre il file in modalità binaria, rb, e legge un mebibyte (MiB) alla volta invece di caricare l'intero file in memoria. La sua sintassi con espressioni di assegnazione richiede Python 3.8 o versioni successive.
import hashlib
import sys
if len(sys.argv) != 2:
raise SystemExit("Usage: python hash-file.py FILE")
digest = hashlib.sha256()
with open(sys.argv[1], "rb") as file:
while chunk := file.read(1024 * 1024):
digest.update(chunk)
print(digest.hexdigest())
Dalla cartella dello script, passa il percorso del tuo file reale come segue. Se il tuo comando Python 3 è python3 o py, usa quel comando al posto di python.
python hash-file.py "example.iso"
L'output è un digest esadecimale SHA-256 di 64 caratteri. Byte identici producono lo stesso risultato di PowerShell e altri strumenti, anche se il maiuscolo/minuscolo delle lettere può differire. La documentazione ufficiale di Python su hashlib spiega update() e hexdigest(). File piccoli, vuoti e a più blocchi sono stati controllati con Python 3.12.14 e PowerShell 7.6.5 su Windows per confermare la corrispondenza dei risultati.
Cosa verificare quando gli hash non corrispondono
- File di rilascio diversi: controllare x64 contro ARM64, installer contro archivi, o versioni differenti.
- Algoritmi diversi: MD5, SHA-1 e SHA-256 producono digest diversi. Ricontrollare i nomi degli algoritmi.
- Download incompleti: confermare che il download sia terminato e che lo strumento di download non abbia segnalato errori.
- Estrazione o conversione: l’hash di riferimento di un archivio non si applica a un file estratto da esso. Salvare in un editor, convertire terminazioni di riga e ricomprimere immagini può cambiare i byte.
- Errori di percorso o di copia: verificare il file effettivamente letto dal comando e l’intero valore di riferimento. Evitare un digest troncato o uno copiato da un file diverso.
Non sostituire un valore di riferimento non spiegato con un valore calcolato personalmente per forzare una corrispondenza. Confermare prima il canale di distribuzione e il file da verificare. Se un nuovo download è ancora diverso, verificare le istruzioni dell’editore o se la release è stata corretta.
Cosa possono e non possono fare gli hash
| Utilizzo | Ruolo della funzione di hash | Requisiti aggiuntivi |
|---|---|---|
| Integrità del file | Confrontare il contenuto attuale del file con un digest di riferimento. | La fonte di riferimento e l'algoritmo devono essere appropriati. |
| Rilevamento dei duplicati | Raggruppare i file con hash corrispondenti come candidati duplicati. | Considerare la possibilità di collisioni e confrontare i byte quando l'uguaglianza esatta è essenziale. |
| Firme digitali | Uno schema di firma può utilizzare un digest dei dati. | Calcolare solo un hash non crea una firma né autentica l'autore. |
| Memorizzazione delle password | La verifica delle password utilizza anche meccanismi basati su hash. | Usa un metodo dedicato per la memorizzazione delle password invece del semplice hashing dei file con SHA-256. |
L'hashing non è cifratura. La cifratura è pensata per consentire il recupero del testo in chiaro con la chiave appropriata; un hash non è un formato per ricostruire il suo input. Tuttavia, input brevi o prevedibili possono essere indovinati e i loro hash confrontati, quindi semplicemente fare l'hash di qualcosa non garantisce la segretezza.
Per le password, scegli un'implementazione affidabile di uno schema dedicato di hashing delle password come Argon2id, con un costo appropriato e un salt unico, invece di MD5, SHA-1 o SHA-256 semplici. Un salt è un valore per ciascuna password che rende gli attacchi di indovinamento precomputati meno efficaci. Lo guida OWASP alla memorizzazione delle password spiega perché l'archiviazione delle password e l'hashing dei file richiedono progettazioni diverse. Per i controlli di download, i passaggi essenziali sono calcolare SHA-256, ottenere un riferimento affidabile e confrontare l'intero digest.




