L'hashing si riferisce al processo di generazione di un output di dimensione fissa da un input di dimensione variabile. Tale metodo viene realizzato attraverso l'uso di formule matematiche note come funzioni hash (implementate come algoritmi di hashing). 

Sebbene non tutte le funzioni hash includano costantemente l'uso della crittografia, le funzioni hash crittografiche sono al centro delle criptovalute. Attraverso queste funzionalità, blockchain e altri tipi di sistemi distribuiti sono in grado di raggiungere livelli significativi di integrità e sicurezza dei dati.

Le funzioni hash convenzionali e crittografiche sono deterministiche. Ciò significa che finché l'input non cambia, l'algoritmo di hashing produrrà sempre lo stesso output (noto anche come hash o impronta digitale).

In genere, gli algoritmi di hashing delle criptovalute sono progettati come funzioni unidirezionali, il che significa che non possono essere facilmente invertiti senza impiegare grandi quantità di tempo e risorse di elaborazione. In altre parole, è abbastanza facile creare un output da un input, ma è relativamente difficile procedere nella direzione opposta (generare l'input solo dall'output). Nel complesso, più è difficile trovare l'input, più sicuro è considerato l'algoritmo di hashing.


Come funziona una funzione hash?

Diverse funzioni hash produrranno output di dimensioni diverse, ma le possibili dimensioni degli output specifiche di ciascun algoritmo di hashing sono sempre costanti. Ad esempio, l'algoritmo SHA-256 può produrre solo output a 256 bit, mentre SHA-1 genererà sempre un hash a 160 bit.

Per illustrare il concetto, applichiamo una funzione hash SHA-256 (utilizzata per Bitcoin) alle parole Binance e binance.

SHA-256

Entrata

Uscita (256 bit)

Binanza

Italiano: f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

Binanza

59bba357145ca539dcd1ac957abc1ec58339ddcae7f5e8b5da0c36624784b2


Si noti come una piccola modifica (in questo caso la prima lettera) abbia prodotto un valore hash completamente diverso. Poiché utilizziamo SHA-256, gli output avranno sempre una dimensione fissa di 256 bit (o 64 caratteri), indipendentemente dalla dimensione dell'input. Inoltre, non importa quante volte applichiamo questo algoritmo a queste parole specifiche, i due output saranno sempre gli stessi.

D'altro canto, se utilizzassimo gli stessi input tramite l'algoritmo di hashing SHA-1, otterremmo i seguenti risultati:

SHA-1

Entrata

Uscita (160 bit)

Binanza

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

Binanza

e58605c14a76ff98679322cca0eae7b3c4e08936


L'acronimo SHA sta per Secure Hash Algorithms. Si riferisce a un set di funzioni crittografiche che include gli algoritmi SHA-0 e SHA-1, nonché i gruppi SHA-2 e SHA-3. SHA-256 fa parte del gruppo SHA-2, insieme a SHA-512 e altre varianti. Attualmente, solo i gruppi SHA-2 e SHA-3 sono considerati sicuri.


Perché sono importanti?

Le funzioni hash convenzionali hanno un'ampia gamma di casi d'uso, tra cui ricerche nei database, analisi di file di grandi dimensioni e gestione dei dati. D'altro canto, le funzioni hash crittografiche sono ampiamente utilizzate nelle applicazioni di sicurezza informatica, come l'autenticazione dei messaggi e la stampa delle impronte digitali. Quando si tratta di Bitcoin, le funzioni hash crittografiche sono una parte essenziale del processo di mining e svolgono anche un ruolo nella generazione di nuovi indirizzi e chiavi.

La vera potenza dell'hashing si rivela quando si ha a che fare con enormi quantità di informazioni. Ad esempio, è possibile eseguire un file o un set di dati tramite una funzione hash e quindi utilizzare il suo output per verificare rapidamente la correttezza e l'integrità dei dati. Ciò è possibile grazie alla natura deterministica delle funzioni hash: l'input produrrà sempre un output semplificato e condensato (hash). Questa tecnica elimina la necessità di memorizzare e ricordare grandi quantità di dati.

L'hashing è particolarmente utile nel contesto della tecnologia blockchain. La blockchain di Bitcoin presenta diverse operazioni che implicano l'hashing, la maggior parte delle quali avviene nel processo di mining. Infatti, quasi tutti i protocolli di criptovaluta si basano sull'hashing per connettere e condensare gruppi di transazioni in blocchi, nonché per produrre collegamenti crittografici tra ciascun blocco per creare infine una blockchain, una catena di blocchi.


Funzioni hash crittografiche

Una funzione hash che utilizza tecniche crittografiche può essere definita come funzione hash crittografica. In genere, per violare una funzione hash crittografica sono necessari innumerevoli tentativi di forza bruta. Affinché un individuo possa invertire con successo una funzione hash crittografica, dovrebbe indovinare qual è l'input attraverso molti tentativi e fallimenti fino a produrre l'output corretto. Tuttavia, esiste anche la possibilità che input diversi producano esattamente lo stesso output: in questo caso si verifica una collusione.

Tecnicamente, una funzione hash crittografica deve rispettare tre proprietà per essere considerata effettivamente sicura. Possiamo descriverlo come: resistenza alla collisione, resistenza alla preimmagine e seconda resistenza alla preimmagine.

Prima di analizzare ciascuna proprietà, riassumiamo la loro logica in tre brevi frasi.

  • Resistenza alle collisioni: è impossibile trovare due input distinti che producano lo stesso hash in output.

  • Resistenza preimmagine: è impossibile invertire la funzione hash (trovare l'input da un dato output).

  • Resistenza della seconda preimmagine: è impossibile trovare un secondo input che entri in collisione con un input specificato.


Resistenza alle collisioni

Come accennato, una collisione si verifica quando input diversi producono esattamente lo stesso hash. Quindi una funzione hash è considerata a prova di collisione finché qualcuno non ne rileva una. Si noti che le collisioni esisteranno sempre per qualsiasi funzione hash perché i possibili input sono infiniti, mentre i possibili output sono finiti.

In altre parole, una funzione hash è resistente alle collisioni quando la possibilità di trovare una collisione è così piccola che richiederebbe milioni di anni di calcoli. Quindi, sebbene non esistano funzioni hash esenti da collisioni, alcune di esse sono sufficientemente potenti da essere considerate resistenti alle collisioni (ad esempio SHA-256).

Tra i vari algoritmi SHA, i gruppi SHA-0 e SHA-1 non sono più considerati sicuri perché sono state riscontrate delle collisioni. Attualmente, i gruppi SHA-2 e SHA-3 sono considerati resistenti alle collisioni.


Resistenza alla preimmagine

La proprietà della resistenza preimmagine è legata al concetto di funzioni unidirezionali. Una funzione hash è considerata resistente alle immagini quando la probabilità di trovare l'input che ha generato un particolare output è molto bassa.

Si noti che questa proprietà è diversa dalla precedente, perché qui un ipotetico aggressore proverebbe a indovinare l'input esaminando un dato output. Una collisione, d'altro canto, si verifica quando qualcuno trova due input diversi che generano lo stesso output, ma non ha importanza quale input sia stato utilizzato nello specifico.

La proprietà di resistenza pre-immagine è preziosa per la protezione dei dati perché il semplice hashing di un messaggio può dimostrarne l'autenticità, senza doverne rivelare il contenuto. Nella pratica, molti fornitori di servizi e applicazioni web memorizzano e utilizzano hash generati dalle password anziché password in chiaro.


Resistenza alla seconda preimmagine

Per semplificare, possiamo dire che la resistenza alla seconda preimmagine si colloca da qualche parte tra le altre due proprietà. Un secondo attacco pre-immagine si verifica quando qualcuno riesce a trovare un input specifico che genera lo stesso output di un altro input che già conosce.

In altre parole, un secondo attacco pre-immagine comporta la ricerca di una collisione, ma invece di cercare due input casuali che generano lo stesso hash, cerchiamo un input che genera lo stesso hash di un altro input specifico.

Pertanto, qualsiasi funzione hash resistente alle collisioni è resistente anche agli attacchi alla seconda preimmagine, poiché questi comporteranno sempre una collisione. Tuttavia, è ancora possibile eseguire un attacco pre-immagine su una funzione resistente alle collisioni, poiché implica la ricerca di un singolo input da un singolo output.


Estrazione mineraria

Ci sono molti passaggi nel mining di Bitcoin che coinvolgono funzioni hash, come il controllo dei saldi, la creazione del collegamento di input/output delle transazioni e l'hashing delle transazioni in un blocco per formare un Merkle Tree. Ma uno dei motivi principali per cui la blockchain di Bitcoin è sicura è che i miner devono eseguire una miriade di operazioni di hashing per trovare una soluzione valida per creare e aggiungere un blocco.

Nello specifico, un minatore deve provare diversi input diversi quando crea un valore hash per il blocco a cui si riferisce. In sostanza, saranno in grado di convalidare il loro blocco solo se generano un hash di output che inizia con un certo numero di zeri. Il numero di zeri determina la difficoltà del mining, che varia a seconda dell'hash rate dedicato alla rete.

In questo caso, l'hash rate rappresenta la quantità di energia di calcolo investita nel mining di Bitcoin. Se l'hash rate della rete aumenta, il protocollo Bitcoin regolerà automaticamente la difficoltà di mining in modo che il tempo medio impiegato per estrarre un blocco rimanga vicino ai 10 minuti. D'altro canto, se diversi miner decidono di interrompere l'attività di mining, causando un calo significativo dell'hash rate, la difficoltà di mining verrà modificata, rendendo l'attività di mining più semplice (finché il tempo medio di un blocco non si ridurrà a 10 minuti).

Si noti che i miner non hanno bisogno di cercare possibili collisioni perché possono generare più hash come output valido (a partire da un numero specifico di zeri). Esistono quindi diverse soluzioni possibili per un determinato blocco e i minatori devono trovarne una, in base alla soglia determinata dalla difficoltà di mining.

Poiché il mining di Bitcoin è un'attività ad alto costo, i miner non hanno alcun incentivo a imbrogliare all'interno del sistema, poiché ciò comporterebbe notevoli perdite finanziarie. Più minatori ci sono in una blockchain, e quindi più questa diventa grande, più diventa solida.


Per concludere

Non c'è dubbio che le funzioni hash siano strumenti essenziali nell'informatica, soprattutto quando si ha a che fare con enormi quantità di dati. In combinazione con la crittografia, gli algoritmi di hashing possono rivelarsi molto versatili, soprattutto per quanto riguarda la sicurezza e l'autenticazione, sotto diversi aspetti. Pertanto, le funzioni hash crittografiche sono essenziali per quasi tutte le reti di criptovaluta, quindi comprenderne le proprietà e i meccanismi di funzionamento è sicuramente utile per chiunque sia interessato alla tecnologia blockchain.