Una funzione hash è una trasformazione che dato un ingresso m arbitrario di dimensione variabile, restituisce in uscita una stringa a lunghezza fissa chiamata valore hash h (h=H(m)). Le funzioni hash hanno moltissime applicazioni. Una funzione hash impiegata in crittografia deve essere sicura, i requisiti base cui deve soddisfare sono:
* input di dimensione qualsiasi
* output di dimensione fissa
* H(x) relativamente facile da calcolare per ogni dato x
* H(x) one-way
* H(x) collision-free
Una funzione hash è detta essere one-way se è "difficile" da invertire, ovvero dato un valore h è computazionalmente infattibile determinare x tale che H(x)=h ( è possibile calcolare la funzione in pochi secondi ma calcolare l'inversa può richiedere mesi o anni).
Se dato x è computazionalmente impossibile trovare y diverso da x tale che H(x)=H(y) allora H( ) è debolmente collision-free.
Se è computazionalmente infattibile determinare una qualsiasi coppia x,y tale che H(x)=H(y) allora la funzione hash è fortemente collision-free.
Possiamo pensare al valore hash come ad una rappresentazione concisa del testo più lungo o documento dal quale è stato ricavato applicando la funzione hash.
Una funzione hash key-dependent one-way necessita di una chiave per calcolare e verificare il valore hash. Ciò è utile ad esempio per propositi di autenticazione, una funzione di questo tipo può essere utilizzata dal mittente e ricevente di un messaggio in un meccanismo di tipo challenge-response.
Due processi che sono in possesso della stessa chiave segreta, possono autenticarsi vicendevolmente accordandosi su una sequenza a cui applicare la funzione hash con la chiave e confrontando i risultati ottenuti. Solo nel caso in cui le chiavi segrete siano uguali i risultati saranno identici (essendo H( ) one-way). E il processo può riconoscere il partner. Una funzione key-dependent one-way può essere implementata semplicemente appendendo all'input la chiave e calcolando il valore di una funzione one-way hash.