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?
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).
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
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.