La funzione di hashing è una funzione matematica che ha delle caratteristiche semplici e precise. Come tutte le funzioni matematiche ha un insieme di valori che le possono essere passate come variabile d’ingresso ed un insieme di valori che saranno il risultato o variabile d’uscita.
Output = F ( Input )
Insieme dei valori di ingresso
Nel caso delle funzioni di hashing avremo che l’insieme dei valori che può assumere la variabile d’ingresso, ovvero l’input, è definito in modo informale come “qualunque dato”, sia esso un semplice bit, un byte, un pixel, un documento word, o un video su youtube. Tutti questi esempi sono traducibili in lunghe o brevi stringhe di bit e come tali possono essere delle valide variabili d’ingresso per la funzione di hashing.
Insieme dei valori di uscita
Diversamente da quanto avviene per l’input, l’output di una funzione di hashing ha sempre una lunghezza predefinita e fissa. Allo stato dell’arte si utilizzano funzioni di hashing chiamate SHA256 il cui insieme dei valori consentiti in uscita è definito come “l’insieme delle combinazioni di stringhe di 256 bit”.
Non sfuggirà al lettore che l’insieme di tali combinazioni è un insieme di un numero enorme di elementi, per la precisione è costituito da 2^256 possibili combinazioni, ovvero un numero di possibili valori di uscita della magnitudine di 10^70 (1 seguito da 70 zeri)
Replicabilità del risultato
Una funzione di hashing ha una caratteristica molto importante, genera un output che non cambia nel tempo se non cambia nel tempo il suo input.
Ovvero, se noi calcoliamo oggi
Output_1 = F( File pdf contenente la Divina Commedia)
E poi calcoliamo domani
Output_2 = F( File pdf contenente la Divina Commedia)
Il risultato sarà sempre lo stesso.
Non prossimità dei risultati e non invertibilità
Figura Caso 1: input pari al messaggio “Ciao”
Figura Caso 2: input pari al messaggio “Ciao!”
Come si evidenzia dalle figure, la stessa funzione di hash riceve due input leggermente diversi, essi differiscono solo per la presenza del carattere “!” alla fine. Eppure il loro output è completamente diverso.
Questo non consente ad un eventuale attaccante malevolo di capire, data la conoscenza del solo output della funzione di hash, quale fosse il dato di input usato all’origine. In questo senso si dice che la funzione di hash è “non invertibile” ovvero non è possibile capire gli ingressi a partire dalle uscite.
Ancorché la parola “impossibile” venga spesso usata anche nel contesto di questo testo, è importante precisare che in realtà invertire una funzione di hash non è un problema impossibile ma soltanto “impraticabile”.
Infatti è sempre possibile generare a caso dati di input fino a che non riusciamo a trovare un output uguale a quello che vogliamo invertire.
A cosa servono le funzioni di hashing
Le applicazioni delle funzioni di hashing sono molteplici:
- Una funzione di hashing può essere utilizzata per archiviare le password degli utenti in modo sicuro. Invece di memorizzare la password in chiaro, viene calcolato l’hash della password e viene memorizzato l’hash. Quando un utente inserisce la password per accedere al sistema, viene calcolato l’hash della password inserita e viene confrontato con l’hash memorizzato. Se i due hash corrispondono, significa che la password inserita è corretta.
- Le funzioni di hashing sono anche utilizzate per verificare l’integrità dei dati durante il trasferimento attraverso una rete. Ad esempio, quando si scarica un file da Internet, è possibile calcolare l’hash del file scaricato e confrontarlo con l’hash fornito dal sito Web di origine. Se i due hash corrispondono, significa che il file non è stato alterato durante il trasferimento.
- Una delle applicazioni più interessanti è proprio quella della realizzazione di uno schema di firma digitale. Ti invito ad approfondire attraverso la lettura di questo articolo.
- Infine, non ultima in ordine di importanza, grazie alla funzione di hashing è possibile costruire la cosiddetta prova di lavoro (proof of work). Un sistema nato inizialmente come una sorta di francobollo digitale per mitigare il fenomeno dello spamming via email e poi reso celebre da Satoshi Nakamoto come meccanismo di costruzione della blockchain Bitcoin.
Rispondi