Cos'è l'Hashing?
Home
Articoli
Cos'è l'Hashing?

Cos'è l'Hashing?

Avanzato
Pubblicato Jul 29, 2019Aggiornato Jan 31, 2023
7m
Con hashing si intende il processo che genera un output di dimensione fissa partendo da un input di dimensioni variabili. Questo viene fatto attraverso l'uso di formule matematiche conosciute come funzioni di hash (implementate come algoritmi di hashing). 
Anche se non tutte le funzioni di hash implicano l'uso di crittografia, le cosiddette funzioni crittografiche di hash sono alla base delle criptovalute. Grazie ad esse, le blockchain e altri sistemi distribuiti sono in grado di raggiungere livelli significativi di integrità e sicurezza dei dati.

Sia le funzioni di hash convenzionali che quelle crittografiche sono deterministiche. Questa proprietà deterministica significa che fino a quando l'input non cambia, l'algoritmo di hashing continuerà a produrre lo stesso output (conosciuto anche come digest o hash).

In genere, gli algoritmi di hashing delle criptovalute sono progettati come funzioni unidirezionali, ovvero che non possono essere facilmente invertite senza enormi quantità di risorse e tempo di computazione. In altre parole, è piuttosto semplice creare l'output dall'input, ma relativamente difficile andare nella direzione opposta (generare l'input partendo dal solo output). In linea di massima, più è difficile trovare l'input, più l'algoritmo di hashing è considerato sicuro.


Come funziona una funzione di hash?

Diverse funzioni di hash produrranno output di dimensioni differenti, ma le possibili dimensioni di output per ciascun algoritmo di hashing saranno sempre costanti. Per esempio, l'algoritmo SHA-256 può produrre esclusivamente output di 256 bit, mentre l'algoritmo SHA-1 genera sempre un digest di 160 bit.

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

SHA-256

Input

Output (256 bit)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


Puoi vedere che un cambiamento minimo (la prima lettera maiuscola/minuscola) è risultato in un valore di hash totalmente differente. Dato che stiamo usando SHA-256, gli output avranno sempre una dimensione fissa di 256 bit (o 64 caratteri) - a prescindere dalle dimensioni dell'input. Inoltre, non importa quante volte elaboriamo le due parole attraverso l'algoritmo, i due output rimarranno costanti.

Invece, se elaboriamo gli stessi input attraverso l'algoritmo di hashing SHA-1, osserviamo i seguenti risultati:

SHA-1

Input

Output (160 bit)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


L'acronimo SHA sta per Secure Hash Algorithms. Si riferisce a un gruppo di funzioni crittografiche di hash 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 altre varianti. Attualmente solo i gruppi SHA-2 e SHA-3 sono considerati sicuri.


Qual è la loro importanza?

Le funzioni di hash convenzionali hanno una vasta gamma di casi d'uso, tra cui ricerca in database, analisi di grandi file e gestione dei dati. Invece, le funzioni crittografiche di hash vengono usate estensivamente nelle applicazioni per la sicurezza informatica, come l'autenticazione di messaggi e l'impronta digitale. Per quanto riguarda Bitcoin, le funzioni crittografiche di hash sono un elemento essenziale del processo di mining e hanno anche un ruolo nella generazione di nuovi indirizzi e chiavi.

Il vero potere dell'hashing si vede quando si ha a che fare con enormi quantità di informazioni. Per esempio, possiamo elaborare un grande file o un dataset attraverso una funzione di hash e usare il suo output per verificare velocemente l'accuratezza e l'integrità dei dati. Questo è possibile grazie alla natura deterministica delle funzioni di hash: l'input risulterà sempre in un output semplificato e condensato (hash). Questa tecnica rimuove la necessità di archiviare e “ricordare” grandi quantità di dati.

L'hashing è particolarmente utile nel contesto della tecnologia blockchain. La blockchain di Bitcoin presenta diverse operazioni che coinvolgono l'hashing, la maggior parte all'interno del processo di mining. Infatti, quasi tutti i protocolli di criptovaluta si basano sull'hashing per collegare e condensare gruppi di transazioni in blocchi, oltre che per produrre collegamenti crittografici tra ciascun blocco, creando effettivamente una blockchain.


Funzioni crittografiche di hash

Una funzione di hash che utilizza tecniche crittografiche può essere definita come una funzione crittografica di hash. In generale, rompere una funzione crittografica di hash richiede una miriade di tentativi a forza bruta. Per riuscire a “invertire” una funzione crittografica di hash, è necessario indovinare l'input a suon di tentativi fino a quando viene prodotto l'output corrispondente. Tuttavia, c'è anche la possibilità di diversi input che producono lo stesso esatto output, caso in cui avviene una “collisione”.

Tecnicamente, una funzione crittografica di hash deve seguire tre proprietà per essere considerata effettivamente sicura. Possiamo descrivere queste proprietà come resistenza alle collisioni, resistenza alla preimmagine e resistenza alla seconda preimmagine.

Prima di esaminare ciascuna proprietà, sintetizziamo la loro logica in tre brevi frasi.

  • Resistenza alle collisioni: computazionalmente intrattabile trovare una coppia di input distinti che producono lo stesso hash come output.

  • Resistenza alla preimmagine:  computazionalmente intrattabile “inertire” la funzione di hash (trovare l'input partendo da un dato output).

  • Resistenza alla seconda preimmagine:  computazionalmente intrattabile trovare un secondo input in collisione con un input specifico.


Resistenza alle collisioni

Come menzionato, una collisione avviene quando input differenti producono la stessa identica hash. Quindi, una funzione di hash è considerata resistente alle collisioni fino a quano qualcuno trova una collisione. Not che le collisioni esisteranno sempre per qualsiasi funzione di hash, dato che i possibili input sono infiniti, mentre i possibili output sono limitati.

In altre parole, una funzione di hash è resistente alle collisioni quando la possibilità di trovare una collisione è così bassa che richiederebbe milioni di anni di computazioni. Quindi, anche se non esistono funzioni di hash resistenti alle collisioni, alcune sono abbastanza forti da essere considerate resistenti (ad es., SHA-256).

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


Resistenza alla preimmagine

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

Not che questa proprietà è differente dalla precedente in quanto un attaccante dovrebbe provare a indovinare l'input esaminando un determinato output. Una collisione, invece, avviene quando qualcuno trova due input differenti che generano lo stesso output, ma non importa quali input vengono usati.

La proprietà di resistenza alla preimmagine è importante per la protezione dei dati perché una semplice hash di un messaggio può dimostrarne l'autenticità, senza dover rivelare le informazioni. In pratica, molti fornitori di servizi e applicazioni web archiviano e utilizzano hash generate da password invece delle password in testo semplice.


Resistenza alla seconda preimmagine

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

In altre parole, un attacco alla seconda preimmagine comprende la scoperta di una collisione, ma invece di cercare due input casuali che generano la stessa hash, si cerca un input che genera la stessa hash che è stata prodotta da un altro determinato input.

Di conseguenza, qualsiasi funzione di hash resistente alle collisioni è anche resistente agli attacchi alla seconda preimmagine, in quanto la seconda proprietà comporta sempre una collisione. Tuttavia, rimane possibile eseguire un attacco alla preimmagine su una funzione resistente alle collisioni in quanto questo comporta la scoperta di un singolo input da un singolo output.


Mining

Ci sono molte fasi nel mining di Bitcoin che coinvolgono funzioni di hash, come il controllo dei saldi, il collegamento tra input e output delle transazioni e l'hashing delle transazioni all'interno di un blocco per formare un Merkle Tree. Ma una delle ragioni fondamentali per cui la blockchain di Bitcoin è sicura è il fatto che i miner devono eseguire una miriade di operazioni di hashing per trovare eventualmente una soluzione valida per il blocco successivo.
Nello specifico, un miner deve tirare a indovinare diversi input quando crea un valore di hash per il suo blocco candidato. In sostanza, saranno in grado di convalidare il blocco solo se generano una hash in output che inizia con un certo numero di zeri. Il numero di zeri è ciò che determina la difficoltà di mining, e varia a seconda della hash rate dedicata al network.

In questo caso, l'hash rate rappresenta quanta potenza di calcolo sta venendo investita nel mining di Bitcoin. Se l'hash rate del network aumenta, il protocollo di Bitcoin regolerà automaticamente la difficoltà di mining per fare in modo che il tempo medio necessario per il mining di un nuovo blocco rimanga all'incirca 10 minuti. Al contrario, se diversi miner decidono di interrompere il mining, causando un calo notevole dell'hash rate, la difficoltà di mining verrà regolata per rendere il processo più facile (fino a quando l'intevallo medio tra i blocchi torna a 10 minuti).

Nota che i miner non devono trovare collisioni perché ci sono dierse hash che possono generare come un output valido (che inizino con un determinato numero di zeri). Quindi ci sono diverse soluzioni possibili per un certo blocco, e i miner devono solo trovarne una - in base alla soglia determinata dalla difficoltà di mining. 

Dato che il mining di Bitcoin è un'attività costosa, i miner non hanno motivo di ingannare il sistema in quanto porterebbe a notevoli perdite finanziarie. Maggiore il numero di miner che lavorano su una blockchain, più grande e forte diventerà.


In chiusura

Non c'è dubbio che le funzioni di hash siano strumenti fondamentali nell'informatica, soprattutto in situazioni che coinvolgono enormi quantità di dati. Quando combinati con la crittografia, gli algoritmi di hashing possono essere molto versatili, offrendo sicurezza e autenticazione in diversi modi. Per questo, le funzioni crittografiche di hash sono indispensabili per quasi tutti i network di criptovalute, ed è quindi sicuramente utile per chiunque sia interessato alla tecnologia blockchain comprenderne le proprietà e i meccanismi di funzionamento.