Cos'è l'hashing?
Nozioni di base
L'hashing è un processo che genera un output di dimensione fissa a partire da un input di dimensione variabile utilizzando formule matematiche note come funzioni hash. Esistono funzioni hash convenzionali e funzioni hash crittografiche, e queste ultime sono al cuore delle criptovalute. Queste funzioni permettono a blockchain e altri sistemi distribuiti di raggiungere elevati livelli di sicurezza e integrità dei dati.
Le funzioni hash sono deterministiche, il che significa che dato lo stesso input produrranno sempre lo stesso output. Questo output è anche chiamato digest o hash.
Gli algoritmi di hashing delle criptovalute sono progettati per essere funzioni a senso unico, ovvero difficili da invertire senza ingenti risorse e potenza di calcolo. È relativamente semplice creare un output a partire dall'input, ma andare nella direzione opposta per ricavare l'input dall'output è una sfida. La sicurezza di un algoritmo di hashing viene generalmente misurata dalla difficoltà di trovare l'input, con un algoritmo più sicuro che richiede un grado di difficoltà maggiore.
Come funziona una funzione hash?
Le funzioni hash sono utilizzate per produrre output di dimensioni fisse diverse, ma le dimensioni possibili dell'output per ciascun algoritmo rimangono costanti. Ad esempio, SHA-256 produrrà sempre un output di 256 bit, mentre SHA-1 genererà solamente un digest di 160 bit. L'hash stesso è una sequenza di lettere e numeri.
Si noti che una piccola differenza nell'input, come la differenza tra maiuscole e minuscole nella prima lettera, determina un valore di hash completamente diverso. Nonostante ciò, per 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 le due parole vengano elaborate dall'algoritmo; l'output sarà sempre lo stesso. Tuttavia, gli output saranno diversi se si utilizzano gli stessi input con l'algoritmo di hashing SHA-1.
È importante sottolineare che SHA sta per Secure Hash Algorithms, che è un insieme di funzioni hash crittografiche che include gli algoritmi SHA-0 e SHA-1, così come i gruppi SHA-2 e SHA-3. L'algoritmo 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.
Qual è l'importanza dell'hashing?
L'hashing ha diversi casi d'uso, dall'analisi di file di grandi dimensioni e gestione dei dati alle applicazioni di sicurezza informatica come l'autenticazione dei messaggi e l'impronta digitale. Le funzioni hash crittografiche svolgono un ruolo cruciale nel processo di mining di Bitcoin e nella creazione di nuovi indirizzi e chiavi. La potenza dell'hashing diventa evidente quando si gestiscono grandi quantità di informazioni. Le funzioni hash condensano l'input in un output (hash), permettendo la verifica dei dati senza la necessità di memorizzare grandi volumi di dati. La tecnologia blockchain beneficia dell'hashing, poiché collega e comprime le transazioni in blocchi, creando una catena di blocchi. La blockchain di Bitcoin si basa fortemente sull'hashing in diverse operazioni, soprattutto nel mining, per produrre collegamenti crittografici tra ogni blocco. In sintesi, l'hashing è una parte fondamentale dei protocolli delle criptovalute per ottenere integrità, sicurezza e immutabilità dei dati.
Funzioni hash
Le funzioni hash hanno molte applicazioni, tra cui gestione dei dati, ricerche in database e analisi di grandi file. Nella sicurezza informatica, le funzioni hash crittografiche sono ampiamente utilizzate per l'impronta digitale e l'autenticazione dei messaggi. Le funzioni hash crittografiche sono essenziali nel processo di mining di Bitcoin e svolgono un ruolo cruciale anche nella creazione di nuove chiavi e indirizzi.
L'hashing è particolarmente utile quando si gestiscono grandi quantità di dati. Elaborando un file o un dataset voluminoso tramite una funzione hash, è possibile verificare rapidamente accuratezza e integrità dei dati utilizzando l'output. Ciò è possibile grazie alla natura deterministica delle funzioni hash, per cui l'input produce sempre un output semplificato e condensato o hash. Questo approccio elimina la necessità di memorizzare e conservare grandi quantità di dati.
Per la tecnologia blockchain, l'hashing è particolarmente rilevante. La maggior parte dei protocolli di criptovaluta dipende dall'hashing per condensare e collegare gruppi di transazioni in blocchi e per produrre collegamenti crittografici tra ogni blocco, creando una blockchain.
Per essere considerata sicura, una funzione hash crittografica deve soddisfare tre proprietà: resistenza alle collisioni, resistenza alla preimmagine e resistenza alla seconda preimmagine.
- La resistenza alle collisioni significa che è impossibile trovare due input distinti che producano lo stesso output.
- La resistenza alla preimmagine significa che è impossibile invertire la funzione hash e trovare l'input a partire da un dato output.
- La resistenza alla seconda preimmagine significa che è impossibile trovare un secondo input che collida con un input specificato.
Resistenza alle collisioni
Una funzione hash è resistente alle collisioni finché qualcuno non trova una collisione in cui input differenti producono lo stesso hash. Le collisioni esisteranno sempre per qualsiasi funzione hash perché i possibili input sono infiniti, mentre i possibili output sono finiti. Le funzioni hash sono considerate resistenti alle collisioni quando la probabilità di trovarne una è così bassa da richiedere milioni di anni di calcolo. Alcune delle funzioni hash che soddisfano questo standard includono SHA-256.
I gruppi SHA-0 e SHA-1 non sono più sicuri perché sono state trovate collisioni. Al contrario, i gruppi SHA-2 e SHA-3 sono considerati resistenti alle collisioni.
Le funzioni hash crittografiche impiegano tecniche crittografiche, e violarle richiede numerosi tentativi di forza bruta. Per invertire una funzione hash crittografica è necessario indovinare l'input per tentativi fino a ottenere l'output corrispondente. Tuttavia, input diversi possono produrre lo stesso output, causando una collisione.
Resistenza alla preimmagine
Le funzioni a senso unico e la resistenza alla preimmagine sono una proprietà delle funzioni hash che garantisce che sia quasi impossibile determinare l'input che ha prodotto un determinato output. Questo è correlato al concetto di funzioni a senso unico, dove è facile calcolare l'output ma difficile ricavare l'input a partire dall'output.
Si noti che la resistenza alla preimmagine è diversa dalla resistenza alle collisioni perché, nel primo caso, un attaccante cercherebbe di indovinare l'input a partire da un dato output. Nel secondo caso, una collisione si verifica quando due input diversi producono lo stesso output.
La resistenza alla preimmagine è preziosa per la protezione dei dati perché un hash di un messaggio può provarne l'autenticità senza rivelare il contenuto del messaggio stesso.
Resistenza alla seconda preimmagine
La resistenza alla seconda preimmagine è una proprietà che si colloca tra le altre due. Consiste nel trovare un input specifico che generi lo stesso output di un altro input già noto. Un attacco di seconda preimmagine è simile a trovare una collisione, tranne per il fatto che si cerca un input che produca lo stesso hash di un input specifico anziché trovare due input casuali che generino lo stesso hash.
Poiché un attacco di seconda preimmagine implica sempre una collisione, qualsiasi funzione hash resistente alle collisioni è anche resistente agli attacchi di seconda preimmagine. Tuttavia, una funzione resistente alle collisioni può comunque essere vulnerabile ad attacchi di preimmagine, poiché questi implicano trovare un singolo input a partire da un singolo output. Pertanto, la resistenza alla preimmagine è una proprietà cruciale delle funzioni hash ed è spesso utilizzata per proteggere i dati. Molti fornitori di servizi e applicazioni web memorizzano e utilizzano hash generati dalle password anziché le password in chiaro. In questo modo possono dimostrare l'autenticità del messaggio senza divulgare le informazioni.
Mining
Il mining di Bitcoin coinvolge più fasi che richiedono l'uso di funzioni hash. Queste fasi includono la verifica dei bilanci, il collegamento degli input e degli output delle transazioni e l'hashing delle transazioni all'interno di un blocco per formare un Merkle Tree. Tuttavia, uno dei principali motivi per cui la blockchain di Bitcoin è sicura è che i miner devono eseguire molte operazioni di hashing per scoprire una soluzione valida per il blocco successivo.
Per generare un valore hash per il loro blocco candidato, un miner deve provare molti input diversi. Essenzialmente, i miner convalidano il loro blocco solo se riescono a produrre un hash di output che inizi con un numero specifico di zeri. Il numero di zeri determina la difficoltà di mining, che varia in funzione dell'hash rate investito nella rete.
L'hash rate indica la quantità di potenza di calcolo investita nel mining di Bitcoin. Se l'hash rate della rete aumenta, il protocollo Bitcoin regolerà automaticamente la difficoltà di mining, garantendo che il tempo medio richiesto per minare un blocco rimanga intorno ai 10 minuti. Al contrario, se numerosi miner smettono di minare riducendo significativamente l'hash rate, la difficoltà di mining verrà regolata per rendere l'estrazione più semplice fino a quando il tempo medio per blocco non tornerà a 10 minuti.
Vale la pena notare che i miner non devono trovare collisioni poiché possono generare più hash che soddisfano i requisiti di validità (con un certo numero di zeri iniziali). Quindi esistono molte possibili soluzioni per un dato blocco, e i miner devono trovare solo una di esse in base alla soglia stabilita dalla difficoltà di mining.
Poiché il mining di Bitcoin è un processo costoso, i miner non hanno incentivo a barare sul sistema, perché farlo comporterebbe perdite finanziarie significative. Più miner partecipano a una blockchain, più questa diventa grande e robusta.
Conclusione
Per chi è interessato alla tecnologia blockchain, le funzioni hash crittografiche sono fondamentali da comprendere. Questi algoritmi offrono sicurezza e autenticazione se combinati con la crittografia, rendendoli estremamente versatili nella gestione di grandi volumi di dati. Le funzioni hash svolgono un ruolo cruciale in quasi tutte le reti di criptovalute. Capirne le proprietà e i meccanismi di funzionamento è essenziale nell'informatica.