Una funzione hash (o funzione di hash) è una funzione unidirezionale (o one-way) che consente di estrarre da un documento grande a piacere una stringa di dimensione prefissata, detta impronta (o anche fingerprint, digest, valore di hash o semplicemente hash).
Il termine hash in inglese richiama il verbo sminuzzare ed esprime il concetto che il documento originario è "triturato" per estrarne una poltiglia.
Da un punto di vista matematico si tratta di funzioni molti a uno ma da un punto di vista pratico la corrispondenza è di tipo uno a uno.
Esistono numerosi algoritmi che realizzano funzioni hash con particolari proprietà che dipendono dal contesto applicativo quali possono essere l'indicizzazione nell'ambito dei database e la crittografia.
In crittografia si parla di funzioni crittografiche di hash ed è richiesto che siano verificate le seguenti proprietà:
resistenza alla preimmagine: deve essere "difficile" trovare il documento (o meglio un documento) che abbia l'impronta data;
resistenza alla seconda preimmagine: deve essere "difficile" trovare un documento che abbia la stessa impronta di un documento dato;
resistenza alle collisioni: deve essere "difficile" trovare due documenti qualsiasi con la stessa impronta.
Notare che la terza proprietà è la più restrittiva ed include le altre due.
Il termine "difficile" richiama, come al solito, l'impossibilità pratica di effettuare una elaborazione che porti al risultato desiderato in un tempo ragionevole per il contesto applicativo.
Le funzioni crittografiche di hash sono utilizzate in tantissime situazioni, come ad esempio:
memorizzazione delle credenziali di accesso ad un sistema: normalmente sui server non è registrata la password ma la sua impronta;
controllo di integrità dei programmi scaricabili on-line: in corrispondenza del programma o driver da scaricare, viene indicato il valore di hash (spesso calcolato in base all'algoritmo MD5) in modo da consentire di verificarne l'integrità;
autenticazione di documenti: la funzione è utilizzata in associazione con la crittografia asimmetrica.
Alcuni standard di riferimento attuali sono:
SHA-2, con le implementazioni SHA-256, SHA-384 e SHA-512 (il valore fa riferimento alla lunghezza dell'impronta in bit);
MD5, con impronta a 128 bit.
E' possibile trovare in linea molti tool che implementazioni funzioni hash, ad esempio qui.
Nota:
In considerazione del fatto che le password non sono memorizzate in chiaro sui sistemi informatici ma sotto forma di valore di hash, è stata messa a punto una tecnica di attacco basata sulle tabelle arcobaleno (rainbow table) che memorizzano milioni di coppie password - valore di hash, precalcolate una volta per tutte.
In questo modo, a fronte di centinaia di gigabyte di occupazione, si creano le condizioni perché siano possibili attacchi a dizionario.
Per contrastare questo tipo di tecnica, i server associano un salt alla password al momento del calcolo del valore di hash, in modo che sia altamente improbabile ritrovare il codice nelle tabelle arcobaleno.
Un salt è un codice generato casualmente ma accoppiato in modo stabile all'identificativo dell'utente.
In gergo si dice che la password viene salata prima di calcolare il valore di hash.
Sito: 7ecnologie
Sezione: 14. Sicurezza informatica
Capitolo: 02. Crittografia
Paragrafo: 04. Funzione hash
Indice dei capitoli: 00. Risorse - 01. Il quadro normativo - 02. Crittografia - 03. Protocolli per la sicurezza - 04. Applicazioni e Servizi - 98. Esercizi
Indice dei paragrafi: 01. Cifrari nella storia - 02. Crittografia simmetrica - 03. Crittografia asimmetrica - 04. Funzione hash - 05. Certificato digitale - 06. Firma digitale - 07. Codifica base 64 - 08. LAB