L'elaborazione hash si riferisce al processo di generazione di un output di dimensioni fisse da un input di dimensioni diverse. Ciò avviene attraverso l'uso di una formula matematica nota come funzione hash (implementata come un algoritmo di hashing).

Anche se non tutte le funzioni hash sono legate all'uso della crittografia, quelle note come funzioni hash crittografiche sono al centro delle criptovalute. Grazie a ciò, la blockchain e altri sistemi distribuiti sono in grado di raggiungere livelli significativi di integrità e sicurezza dei dati.

Le funzioni hash convenzionali e gli hash crittografici sono gli stessi: deterministici. Essere deterministico significa che finché l'input non cambia, l'algoritmo di hashing produrrà sempre lo stesso output (altrimenti noto come digest o hash).

In particolare, l’algoritmo di hashing delle criptovalute è concepito come una funzione unidirezionale, il che significa che non può essere facilmente invertito senza enormi tempi e risorse di calcolo. In altre parole, è molto semplice produrre output da input, ma relativamente difficile fare il contrario (generare input solo da output). In generale, quanto più difficile è trovare l’input, tanto più sicuro sarà l’algoritmo di hashing.


Come funziona una funzione hash?

Diverse funzioni di hash produrranno output di dimensioni diverse, ma la possibile dimensione di output di ciascun algoritmo di hashing è sempre costante. Ad esempio, l'algoritmo SHA-256 produrrà solo un output a 256 bit, mentre SHA-1 produrrà sempre un digest a 160 bit.

Per illustrarlo, eseguiamo le parole "Binance" e "binance" attraverso l'algoritmo di hashing SHA-256 (quello utilizzato in Bitcoin).

SHA-265

Ingresso

Uscita (256 bit)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


Tieni presente che piccole modifiche (dimensione della prima lettera) determinano valori hash molto diversi. Ma poiché utilizziamo SHA-256, l'output avrà sempre una dimensione fissa di 256 bit (o 64 caratteri), indipendentemente dalla dimensione dell'input. Inoltre, non importa quante volte eseguiamo queste due parole attraverso l'algoritmo, entrambi gli output saranno sempre costanti.

D'altra parte, se eseguiamo gli input tramite l'algoritmo di hashing SHA-1, avremo i risultati seguenti:

SHA-1

Ingresso

Uscita (160 bit)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


Nello specifico, l’acronimo SHA significa Secure Hash Algorithms. Si riferisce a un insieme di funzioni hash crittografiche che include gli algoritmi SHA-0 e SHA-1 insieme ai 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é questo è importante?

Le funzioni hash convenzionali hanno un'ampia varietà di casi d'uso, tra cui la ricerca nel database, l'analisi di grandi quantità di dati e la 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 importante del processo di mining e contribuiscono alla generazione di nuovi indirizzi e chiavi.

Il vero potere di hashing si vede quando si ha a che fare con quantità molto grandi di informazioni. Ad esempio, è possibile eseguire un file di grandi dimensioni o un set di dati tramite una funzione hash e quindi utilizzare l'output per verificare rapidamente l'accuratezza e l'integrità dei dati. Ciò è possibile grazie alla natura deterministica delle funzioni hash: l'input produce sempre un output semplice e conciso (hash). Tecniche come questa eliminano la necessità di archiviare e “ricordare” grandi quantità di dati.

In particolare, l’hashing è molto utile nella tecnologia blockchain. La blockchain di Bitcoin ha diversi processi che coinvolgono l'hashing, la maggior parte dei quali sono nel processo di mining. Infatti, quasi tutti i protocolli di criptovaluta si basano sull’hashing per collegare gruppi compatti di transazioni in blocchi e anche per generare collegamenti crittografici tra singoli blocchi, 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 un enorme sforzo di forza bruta. Se qualcuno vuole “invertire” una funzione hash crittografica, allora deve indovinare quale sia l’input per tentativi ed errori fino a quando non viene prodotto l’output appropriato. Tuttavia, è anche possibile che input diversi producano esattamente lo stesso output, quindi in questo caso si verifica una “collisione”.

Tecnicamente, una funzione hash crittografica deve rispettare tre proprietà per essere considerata sicura ed efficace. Possiamo descriverli come resistenza alle collisioni, resistenza alla preimmagine e resistenza alla preimmagine secondaria.

Prima di discutere ogni caratteristica, riassumiamo questa logica in tre brevi frasi.

  • Resistenza alle collisioni: non è facile trovare due input diversi che producono lo stesso hash in output.

  • Resistenza alla preimmagine: non è facile "invertire" una funzione hash (trovare l'input dall'output disponibile).

  • Seconda resistenza alla preimmagine: non è facile trovare un secondo input che si scontra con l'input specificato.


Resistenza alle collisioni

Come accennato, si verifica una collisione quando diversi input producono lo stesso hash. Pertanto, la funzione hash è considerata resistente alle collisioni fino al momento in cui si incontra una collisione. Tieni presente che queste collisioni esisteranno sempre per qualsiasi funzione hash perché i possibili input sono infiniti, mentre i possibili output sono limitati.

In altre parole, una funzione hash si dice a prova di collisione quando la probabilità di trovare una collisione è molto piccola, poiché richiede milioni di anni di calcolo. Pertanto, nonostante non esistano funzioni hash esenti da collisioni, alcune di esse sono molto forti e possono essere considerate robuste (esempio: SHA-256).

Tra i vari algoritmi SHA, i gruppi SHA-0 e SHA-1 non sono più sicuri, poiché sono state scoperte delle collisioni. Attualmente, i gruppi SHA-2 e SHA-3 sono considerati resistenti agli urti.


Resistenza alla preimmagine

La proprietà della resistenza alla preimmagine è legata al concetto di funzioni unidirezionali. Una funzione hash è considerata resistente alla preimmagine quando la probabilità che qualcuno trovi un input risultante da un particolare output è molto piccola.

Tieni presente che questa proprietà è diversa dalla precedente perché l'attaccante proverà a indovinare quale sia l'input guardando l'output disponibile. Una collisione, invece, si verifica quando qualcuno incontra due input diversi che producono lo stesso output, ma non importa quale input venga utilizzato.

La proprietà di resistenza alla preimmagine è molto utile per proteggere i dati perché un semplice hash di un messaggio può dimostrarne l'autenticità, senza dover rivelare l'informazione. In pratica, molti fornitori di servizi e applicazioni web archiviano e utilizzano gli hash risultanti delle password anziché le password in testo semplice.


Seconda anteprima della resistenza

In parole povere, possiamo dire che questa seconda resistenza Preimage è tra le due proprietà discusse in precedenza. Il secondo attacco di preimmagine si verifica quando qualcuno è in grado di trovare un particolare input che produce lo stesso output di un altro output da un input diverso già noto.

In altre parole, il secondo attacco preimmagine consiste nel trovare collisioni, ma invece di cercare due input casuali che producono lo stesso hash, cercano input che producono lo stesso hash prodotto da un altro input specifico.

Pertanto, qualsiasi funzione hash resistente alle collisioni è anche resistente agli attacchi di seconda preimmagine. Tuttavia, è ancora possibile eseguire un attacco preimmagine su una funzione resistente alle collisioni perché ciò significa anche 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 delle transazioni di input e output e le transazioni di hashing 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 un gran numero di operazioni di hashing per trovare infine la soluzione corretta per il blocco successivo.

Nello specifico, un minatore deve provare diversi input diversi quando genera valori hash per i suoi blocchi candidati. In sostanza, può validare il suo blocco solo se produce in output un hash che inizia con un certo numero di zeri. Il numero di zeri determina la difficoltà di mining e questa varia a seconda dell'hash rate specifico della rete.

In questo caso, l’hash rate rappresenta la quantità di energia del computer utilizzata per il 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 rimanente sia più vicino ai 10 minuti. Al contrario, se alcuni miner decidono di interrompere il mining, ciò fa sì che l’hash rate diminuisca drasticamente, la difficoltà di mining si adeguerà, rendendolo più semplice (fino a quando il tempo medio di blocco non ritorna a 10 minuti).

Tieni presente che i minatori non devono incontrare collisioni perché ci sono molti hash che possono produrre come output valido (a partire da un certo numero di zeri). Esistono quindi diverse soluzioni possibili per un particolare blocco e i minatori devono trovare solo una soluzione a seconda della soglia determinata dal livello di difficoltà di mining. 

Poiché il mining di Bitcoin è un’attività costosa, i minatori non hanno motivo di imbrogliare il sistema, ciò comporterebbe perdite finanziarie significative. Più minatori si uniscono alla blockchain, più grande e forte diventerà.


Idea conclusiva

Non c’è dubbio che le funzioni hash siano uno strumento molto importante in informatica, soprattutto quando si ha a che fare con grandi quantità di dati. Se combinati con la crittografia, gli algoritmi di hashing possono essere versatili, offrendo sicurezza e autenticità in vari modi. Pertanto, le funzioni di hash crittografico sono essenziali per quasi tutte le reti di criptovaluta, quindi comprendere le loro proprietà e come funzionano è qualcosa di molto utile per chiunque sia interessato alla tecnologia blockchain.