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

Anche se non tutte le funzioni hash implicano l'uso della crittografia, le cosiddette funzioni hash crittografiche sono al centro delle criptovalute. Grazie a loro, le blockchain e altri sistemi distribuiti sono in grado di raggiungere livelli significativi di integrità e sicurezza dei dati.

Sia le funzioni hash convenzionali che quelle crittografiche sono deterministiche. Essere deterministico significa che finché l’input non cambia, l’algoritmo di hashing produrrà sempre lo stesso output (noto anche come digest o hash).

In genere, gli algoritmi di hashing delle criptovalute sono progettati come funzioni unidirezionali, il che significa che non possono essere facilmente ripristinati senza grandi quantità di tempo e risorse di calcolo. In altre parole, è abbastanza semplice creare l’output dall’input, ma relativamente difficile andare nella direzione opposta (generare l’input solo dall’output). In generale, quanto più difficile è trovare l’input, tanto più sicuro è considerato l’algoritmo di hashing.


Come funziona una funzione hash?

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

Per illustrare, eseguiamo le parole “Binance” e “binance” attraverso l’algoritmo di hashing SHA-256 (quello utilizzato in Bitcoin).

SHA-256

Ingresso

Uscita (256 bit)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


Tieni presente che una modifica minore (l'involucro della prima lettera) ha prodotto un valore hash completamente diverso. Ma 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 eseguiamo le due parole attraverso l’algoritmo, i due output rimarranno costanti.

Al contrario, se eseguissimo gli stessi input tramite l'algoritmo di hashing SHA-1, avremmo i seguenti risultati:

SHA-1

Ingresso

Uscita (160 bit)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


In particolare, l’acronimo SHA sta per Secure Hash Algorithms. Si riferisce a un insieme di funzioni hash crittografiche che includono gli algoritmi SHA-0 e SHA-1 insieme ai gruppi SHA-2 e SHA-3. Lo SHA-256 fa parte del gruppo SHA-2, insieme allo SHA-512 e ad 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 delle informazioni, come l’autenticazione dei messaggi e l’impronta digitale. Quando si tratta di Bitcoin, le funzioni hash crittografiche sono una parte essenziale del processo di mining e svolgono un ruolo anche nella generazione di nuovi indirizzi e chiavi.

Il vero potere dell’hashing si manifesta quando si ha a che fare con enormi quantità di informazioni. Ad esempio, è possibile eseguire un file o un set di dati di grandi dimensioni tramite una funzione hash e quindi utilizzare il relativo output per verificare rapidamente l'accuratezza e l'integrità dei dati. Ciò è possibile grazie alla natura deterministica delle funzioni hash: l'input risulterà sempre in un output semplificato e condensato (hash). Tale tecnica elimina la necessità di archiviare e “ricordare” grandi quantità di dati.

L’hashing è particolarmente utile nel contesto della tecnologia blockchain. La blockchain di Bitcoin prevede diverse operazioni che implicano l'hashing, la maggior parte delle quali all'interno del processo di mining. In effetti, quasi tutti i protocolli di criptovaluta si basano sull’hashing per collegare e condensare gruppi di transazioni in blocchi e anche per produrre collegamenti crittografici tra ciascun blocco, creando di fatto una blockchain.


Funzioni hash crittografiche

Ancora una volta, una funzione hash che impiega tecniche crittografiche può essere definita come una funzione hash crittografica. In generale, violare una funzione hash crittografica richiede una miriade di tentativi di forza bruta. Affinché una persona possa "ripristinare" una funzione hash crittografica, dovrebbe indovinare quale fosse l'input per tentativi ed errori fino a quando non viene prodotto l'output corrispondente. Tuttavia, esiste anche la possibilità che input diversi producano esattamente lo stesso output, nel qual caso si verifica una “collisione”.

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

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

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

  • Resistenza alla preimmagine: impossibile "invertire" la funzione hash (trovare l'input da un determinato output).

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


Resistenza alle collisioni

Come accennato, si verifica una collisione quando input diversi producono esattamente lo stesso hash. Pertanto, una funzione hash è considerata resistente alle collisioni fino al momento in cui qualcuno trova una collisione. 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ì bassa che richiederebbe milioni di anni di calcoli. Pertanto, nonostante non esistano funzioni hash esenti da collisioni, alcune di esse sono abbastanza forti da essere considerate resistenti (ad esempio SHA-256).

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


Resistenza alla preimmagine

La proprietà della resistenza alla preimmagine è legata al concetto di funzioni unidirezionali. Una funzione hash è considerata resistente alla preimmagine quando esiste una probabilità molto bassa che qualcuno trovi l'input che ha generato un particolare output.

Si noti che questa proprietà è diversa dalla precedente perché un utente malintenzionato proverebbe a indovinare quale fosse l'input osservando un determinato output. Una collisione, invece, si verifica quando qualcuno trova due input diversi che generano lo stesso output, ma non importa quali input siano stati utilizzati.

La proprietà della resistenza alla preimmagine è preziosa per la protezione dei dati poiché un semplice hash di un messaggio può dimostrarne l'autenticità, senza la necessità di divulgare le informazioni. In pratica, molti fornitori di servizi e applicazioni web archiviano e utilizzano hash generati dalle password anziché dalle password in chiaro.


Resistenza alla seconda preimmagine

Per semplificare, possiamo dire che la resistenza della seconda preimmagine è una via di mezzo tra le altre due proprietà. Un attacco di seconda preimmagine si verifica quando qualcuno è in grado di trovare un input specifico che genera lo stesso output di un altro input che già conosce.

In altre parole, un attacco di seconda preimmagine implica la ricerca di una collisione, ma invece di cercare due input casuali che generano lo stesso hash, cercano un input che genera lo stesso hash generato da un altro input specifico.

Pertanto, qualsiasi funzione hash resistente alle collisioni è anche resistente agli attacchi di seconda preimmagine, poiché quest'ultimo implicherà sempre una collisione. Tuttavia, è ancora possibile eseguire un attacco preimmagine su una funzione resistente alle collisioni poiché implica trovare un singolo input da un singolo output.


Estrazione

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

Nello specifico, un minatore deve provare diversi input diversi quando crea un valore hash per il blocco candidato. In sostanza, potranno validare il loro blocco solo se genereranno un hash di output che inizi con un certo numero di zeri. Il numero di zeri è ciò che determina la difficoltà di mining e varia in base all’hash rate dedicato alla rete.

In questo caso, l’hash rate rappresenta la quantità di potenza del computer 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 necessario per estrarre un blocco rimanga vicino ai 10 minuti. Al contrario, se diversi minatori decidono di interrompere il mining, provocando un calo significativo dell’hash rate, la difficoltà di mining verrà adeguata, rendendo più semplice il mining (fino a quando il tempo medio di blocco non torna a 10 minuti).

Tieni presente che i minatori non devono trovare collisioni perché ci sono più hash che possono generare come output valido (a partire da un certo numero di zeri). Esistono quindi diverse soluzioni possibili per un determinato blocco e i minatori devono trovarne solo una, in base alla soglia determinata dalla difficoltà di mining.

Poiché il mining di Bitcoin è un compito ad alto costo, i minatori non hanno motivo di imbrogliare il sistema poiché ciò comporterebbe perdite finanziarie significative. Più minatori si uniscono a una blockchain, più questa diventa grande e forte.


Pensieri conclusivi

Non c’è dubbio che le funzioni hash siano strumenti essenziali in informatica, soprattutto quando si ha a che fare con enormi quantità di dati. Se combinati con la crittografia, gli algoritmi di hashing possono essere piuttosto versatili, offrendo sicurezza e autenticazione in molti modi diversi. Pertanto, le funzioni di hash crittografico sono vitali per quasi tutte le reti di criptovalute, quindi comprenderne le proprietà e i meccanismi di funzionamento è sicuramente utile per chiunque sia interessato alla tecnologia blockchain.