La parola hashing si riferisce al processo di creazione di output di dimensioni fisse da input di dimensioni variabili. Ciò avviene utilizzando formule matematiche conosciute come funzioni di hash (applicate come algoritmi di hashing).
Sebbene non tutte le funzioni di hash utilizzino la crittografia, quelle conosciute come funzioni di hash crittografiche sono il cuore delle criptovalute. Grazie a esse, la blockchain e altri sistemi distribuiti possono raggiungere livelli significativi di integrità e sicurezza dei dati.
Sia le funzioni di hash tradizionali che quelle crittografiche sono deterministiche. Il significato di essere deterministico è che finché l'input non cambia, l'algoritmo di hash produrrà sempre gli stessi output (noto anche come Digest o Hash).
Di solito, gli algoritmi di hashing per le criptovalute sono progettati come funzioni unidirezionali, il che significa che non possono essere facilmente invertiti senza un'enorme quantità di tempo e risorse computazionali. In altre parole, è molto facile ottenere output dagli input, ma è relativamente difficile fare il contrario (ottenere input dagli output). In generale, più è difficile trovare gli input, più l'algoritmo di hashing è sicuro.
Come funzionano le funzioni di hash?
Diverse funzioni di hash producono output di dimensioni diverse, ma le dimensioni degli output possibili per ogni algoritmo di hashing sono sempre fisse. Ad esempio, l'algoritmo SHA-256 può produrre solo output di 256 bit, mentre SHA-1 genera sempre un sommario di 160 bit.
Per illustrare, eseguiamo la parola 'Binance' e 'binance' attraverso l'algoritmo di hashing SHA-256 (utilizzato in Bitcoin).
Nota che un piccolo cambiamento (nella forma della lettera iniziale) ha portato a un valore di hash completamente diverso. Ma poiché stiamo usando 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, gli output rimarranno costanti.
Al contrario, se eseguiamo gli stessi input attraverso l'algoritmo di hashing SHA-1, otterremo i seguenti risultati:
È importante notare che la parola SHA è un acronimo per le funzioni Secure Hash. Si riferisce a un insieme di funzioni di hash crittografico che includono gli algoritmi SHA-0 e SHA-1, insieme agli insiemi SHA-2 e SHA-3. SHA-256 è 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é è importante?
Le funzioni di hash tradizionali hanno un'ampia gamma di casi d'uso, tra cui ricerche in database, analisi di grandi file e gestione dei dati. D'altra parte, le funzioni di hash crittografiche sono ampiamente utilizzate in applicazioni di sicurezza informatica, come l'autenticazione dei messaggi e le impronte digitali. Per Bitcoin, le funzioni di hash crittografiche sono una parte fondamentale del processo di mining e giocano anche un ruolo nella creazione di nuovi indirizzi e chiavi.
La vera potenza dell'hashing si manifesta quando si lavora con enormi quantità di informazioni. Ad esempio, è possibile eseguire un file grande o un dataset attraverso una funzione hash e quindi utilizzare il suo output per verificare rapidamente l'accuratezza e l'integrità dei dati. Questo è possibile grazie alla natura deterministica delle funzioni di hash: gli input producono sempre output semplificati e compressi (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 contiene molte operazioni che coinvolgono l'hashing, la maggior parte delle quali si verifica durante il mining. Infatti, quasi tutti i protocolli delle criptovalute si basano sull'hashing per collegare e comprimere i gruppi di transazioni in blocchi. Inoltre, per creare collegamenti crittografici tra ogni blocco, il che porta a una creazione efficace della blockchain.
Funzioni di hash crittografiche
Ancora una volta, una funzione di hash (hashing) che utilizza tecniche di crittografia può essere definita come una funzione di hash crittografica. Violare una funzione di hash crittografica richiede un numero incalcolabile di tentativi di attacco brute-force. Per invertire una funzione di hash crittografica, devono indovinare quali erano gli input attraverso tentativi ed errori fino a produrre gli output corrispondenti. Ma è anche possibile che input diversi producano gli stessi output e in questo caso si verifica una 'collisione'.
Tecnicamente, una funzione di hash crittografica deve seguire tre proprietà affinché possa essere considerata sicura in modo efficace. Possiamo descrivere queste proprietà come segue: resistenza alle collisioni, resistenza all'immagine pre e resistenza alla seconda immagine pre.
Prima di discutere ogni proprietà, riassumiamo la loro logica in tre frasi brevi.
Resistenza alle collisioni: non è possibile trovare due input diversi che producano lo stesso hash come output.
Resistenza all'immagine pre: non è possibile 'invertire' la funzione di hash (trovare gli input da output specifici).
Resistenza alla seconda immagine pre: non è possibile trovare un secondo input che collide con un altro input specifico.
Resistenza alle collisioni
Come abbiamo già accennato, si verifica una collisione quando input diversi producono esattamente lo stesso hash. Pertanto, una funzione di hash è considerata resistente alle collisioni fino al momento in cui qualcuno trova una collisione. Si noti che le collisioni esisteranno sempre per qualsiasi funzione di hash poiché gli input potenziali sono illimitati mentre gli output potenziali sono limitati.
In altre parole, una funzione di hash è resistente alle collisioni quando la probabilità di trovare una collisione è così bassa da richiedere milioni di anni di calcoli. Quindi, anche se non esistono funzioni di hash completamente prive di collisioni, alcune 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ù considerati sicuri a causa della presenza di collisioni. Attualmente, i gruppi SHA-2 e SHA-3 sono considerati resistenti alle collisioni.
Resistenza all'immagine pre
La proprietà della resistenza all'immagine pre è collegata al concetto di funzioni unidirezionali. Una funzione di hash è considerata resistente all'immagine pre quando c'è una probabilità molto bassa che qualcuno trovi gli input che producono output specifici.
Tenendo presente che questa proprietà è diversa dalla precedente, poiché un attaccante cercherà di indovinare quali erano gli input osservando output specifici. D'altra parte, si verifica una collisione quando qualcuno trova input diversi che generano gli stessi output, ma non importa quali input siano stati utilizzati.
La proprietà della resistenza all'immagine pre è preziosa per la protezione dei dati poiché un semplice hash di un messaggio può dimostrare la sua integrità senza rivelare alcuna informazione. Nella pratica, molti fornitori di servizi e applicazioni web memorizzano e utilizzano gli hash generati dalle password anziché le password in chiaro.
Resistenza alla seconda immagine pre
Per semplificare, potremmo dire che la resistenza alla seconda immagine pre si colloca da qualche parte tra le altre proprietà precedenti. Si verifica un attacco alla seconda immagine pre quando qualcuno riesce a trovare un input specifico che genera lo stesso output di un altro input che già conosce.
In altre parole, un attacco alla seconda immagine pre implica trovare una collisione, ma invece di cercare due input casuali che generano lo stesso hash come output, cercano un input che genera lo stesso hash che è stato creato da un altro input specifico.
Pertanto, qualsiasi funzione di hash resistente alle collisioni sarà anche resistente agli attacchi di seconda immagine pre, poiché quest'ultimo significherebbe che si verifica sempre una collisione. Ma gli attaccanti possono ancora eseguire un attacco anticipato su una funzione resistente alle collisioni, poiché implica trovare un input da un singolo output.
Mining
Ci sono molti passaggi nel processo di mining di Bitcoin che coinvolgono funzioni di hash, come la verifica dei saldi, il collegamento di input e output alle transazioni, e l'hashing delle transazioni all'interno di un blocco per formare un Merkle Tree. Ma uno dei principali motivi per cui la blockchain di Bitcoin è considerata sicura è il fatto che i miner hanno bisogno di un numero incalcolabile di hash per trovare una soluzione valida per il blocco successivo.
Specifically, il miner deve provare diversi input quando crea un valore hash per il proprio blocco candidato. In sostanza, saranno in grado di convalidare solo il proprio blocco se riescono a generare un hash che inizia con un certo numero di zeri. Il numero di zeri determina la difficoltà del mining e varia in base alla potenza di hashing dedicata alla rete.
In questo caso, la potenza di hashing rappresenta la quantità di potenza computazionale investita nel mining di Bitcoin. Se la potenza di hashing della rete aumenta, il protocollo Bitcoin regolerà automaticamente la difficoltà del mining in modo che il tempo medio necessario per minare un blocco rimanga vicino a 10 minuti. Al contrario, se molti miner decidono di interrompere il mining, facendo così diminuire drasticamente la potenza di hashing, la difficoltà del mining verrà regolata per facilitare il processo di mining (fino a riportare il tempo medio di mining del blocco a 10 minuti).
Si noti che i miner non devono trovare collisioni, poiché ci sono molti hash che possono generare come output validi (che iniziano con un certo numero di zeri). Pertanto, ci sono molte soluzioni possibili per un determinato blocco e i miner non devono trovarne uno specifico in base all'inizio determinato dalla difficoltà del mining.
Poiché il mining di Bitcoin è estremamente costoso, i miner non hanno un motivo sufficiente per ingannare il sistema, poiché ciò porterebbe a grandi perdite finanziarie. Più miner si uniscono alla blockchain, più diventa forte.
Considerazioni finali
Non c'è dubbio che le funzioni di hash siano strumenti fondamentali nell'informatica, specialmente quando si tratta di gestire enormi quantità di dati. Gli algoritmi di hashing possono essere versatili quando combinati con la crittografia, fornendo sicurezza e autenticazione in vari modi. Di conseguenza, le funzioni di hash crittografiche sono cruciali per quasi tutte le reti di criptovalute. Pertanto, comprendere le loro proprietà e meccanismi di funzionamento è sicuramente utile per chiunque sia interessato alla tecnologia blockchain.
