Funzione hash crittografica

Definizione

Una funzione hash crittografica è un algoritmo matematico che prende in input qualsiasi dato, indipendentemente dalla sua dimensione, e lo trasforma in un digest di lunghezza fissa. Alcune versioni moderne, chiamate eXtendable Output Functions (XOF), possono produrre output di lunghezza personalizzabile. Le funzioni hash possiedono diverse proprietà essenziali: sono deterministiche, ovvero lo stesso input produce sempre lo stesso output; sono resistenti alla preimmagine, quindi è praticamente impossibile invertire un hash per trovare l'input originale; sono resistenti alle collisioni, il che rende praticamente impossibile trovare due input diversi che producano lo stesso hash; e presentano l'effetto valanga, per cui anche una minima modifica all'input si traduce in un output completamente diverso. Bitcoin utilizza SHA-256 per il mining e l'hashing delle transazioni, mentre Ethereum utilizza Keccak-256, una variante di SHA-3. Le funzioni hash sono il fondamento di sicurezza blockchain—consentono di tutto, dalla dimostrazione del lavoro nel settore minerario alla creazione Albero di merkle bozze e firma delle transazioni.

Proprietà delle funzioni hash illustrate

Esempi di hash SHA-256: Input: “Hello” Output: 185f8db32271fe25f561a6fc938b2e26…

Input: “hello” (minuscolo) Output: 2cf24dba5fb0a30e26e83b2ac5b9e29e… → Completamente diverso (effetto valanga)

Input: file video da 10 MB Output: sempre solo 64 caratteri esadecimali (256 bit) → Dimensione di output fissa indipendentemente dalla dimensione di input

Dimostrazione della resistenza alla preimmagine: Obiettivo: trovare l'input che produce "0000abc..." Unico metodo: forza bruta (prova miliardi di input) Mining di Bitcoin: esattamente questo: trovare il nonce che produce un hash inferiore all'obiettivo A 500 exahash/secondo (rete Bitcoin): ~500,000,000,000,000,000,000 tentativi/secondo

Resistenza alle collisioni: Obiettivo: trovare due input diversi che producono lo stesso hash SHA-256: nessuna collisione trovata (2^128 operazioni per trovarne una) SHA-1 (obsoleto): collisioni trovate (Google, 2017) → Non più affidabile

Funzioni hash utilizzate nella crittografia

Funzione hash Dimensione dell'output Usato in Stato
SHA-256 256 bit, Bitcoin (mining, transazioni) Assicurate
Keccak-256 256 bit, Ethereum (indirizzi, transazioni) Assicurate
SHA-3-256 256 bit, Alcuni protocolli più recenti Assicurate
BLAKE2/BLAKE3 Variabile (come XOF) Zcash, alcuni protocolli Sicuro, più veloce
SHA-1 160 bit, Legacy (obsoleto) ROTTO (collisione rilevata)
MD5 128 bit, Legacy (obsoleto) ROTTO (collisione di lieve entità)
RIPE®-160 160 bit, derivazione dell'indirizzo Bitcoin Sicuro (con SHA-256)

FAQ

D: Perché non possiamo invertire un hash per trovare l'input?

Le funzioni hash implicano operazioni matematiche non invertibili: scartano deliberatamente delle informazioni. È possibile verificare che hash(input) = output, ma non è matematicamente possibile invertire hash(output) → input. L'unico attacco generale conosciuto è la forza bruta: provare molti input finché non se ne trova uno che, tramite hash, corrisponde al valore desiderato. Per output a 256 bit, ciò richiede circa 2^256 tentativi, un numero superiore al numero di atomi nell'universo osservabile. Questa irreversibilità è ciò che rende le funzioni hash utili per la memorizzazione delle password, le firme digitali e la prova di lavoro.

D: Cos'è l'"effetto valanga" e perché è importante?

L'effetto valanga significa che la modifica di un solo bit (un singolo carattere) nell'input produce un output hash completamente diverso: in genere, circa la metà dei bit nell'output cambia. Questo è importante per la sicurezza della blockchain: se l'intestazione di un blocco viene modificata anche solo leggermente (per cambiare un timestamp o una transazione), l'hash cambia completamente e diventa non valido, richiedendo di rifare l'intera prova di lavoro. Questo rende la cronologia delle transazioni della blockchain di fatto immutabile.

D: Come vengono utilizzate le funzioni hash nelle firme digitali?

Anziché firmare direttamente un documento di grandi dimensioni, si esegue prima l'hashing del documento (producendo un hash a 256 bit indipendentemente dalle dimensioni del documento), quindi si firma l'hash con la propria chiave privata. Questo metodo è efficiente (firmare un hash di dimensioni fisse è molto più veloce che firmare un file da un gigabyte) e garantisce la sicurezza (la firma dimostra che il documento specifico è stato firmato: qualsiasi modifica altera l'hash e invalida la firma). Tutte le firme delle transazioni blockchain seguono questo schema.

Novità & Eventi speciali