Chiavi, firme e indirizzi · Lezione 1 di 5
Le funzioni hash nella pratica
7 min di lettura
Perché gli hash sono importanti oltre l’intestazione del blocco
Una funzione hash crittografica converte un’informazione digitale in un risultato breve e di dimensione fissa, chiamato valore hash o digest. L’input può essere una frase, un documento, una transazione o una raccolta di record. Un hash sicuro è progettato in modo che anche una piccola modifica all’input produca un output che appare scollegato dall’originale. Questa proprietà è preziosa in una blockchain, perché i partecipanti devono poter confrontare le informazioni senza dover esaminare ripetutamente ogni byte di un grande insieme di dati. È preziosa anche off-chain, quando un revisore vuole verificare se le prove sono cambiate tra il momento della raccolta e quello dell’esame. Un hash è uno strumento di confronto simile a un’impronta digitale, non una carta d’identità né una garanzia che l’informazione sottostante sia vera.
SHA-256, un membro della famiglia SHA-2 descritta nello standard Federal Information Processing Standard (FIPS) 180-4, Secure Hash Standard, del National Institute of Standards and Technology (NIST), produce 256 bit, comunemente visualizzati come 64 caratteri esadecimali. Il sistema esadecimale usa le cifre da 0 a 9 e le lettere da a a f per rappresentare i valori binari in modo compatto. A prescindere dal fatto che l’input originale contenga tre caratteri o tre milioni, un digest SHA-256 ha sempre la stessa lunghezza. Questa lunghezza fissa rende i digest identificatori e controlli d’integrità pratici; non significa che un digest contenga informazioni sufficienti per ricostruire l’input originale.
Tre proprietà da distinguere
Resistenza alla preimmagine e calcolo a senso unico
La resistenza alla preimmagine significa che, dato un valore hash, trovare un input che lo produca dovrebbe essere computazionalmente impraticabile se si usa correttamente un hash sicuro. L’hashing quindi non è cifratura: la cifratura è progettata per consentire il recupero autorizzato del testo in chiaro mediante una chiave, mentre un hash normalmente non offre alcuna operazione di decifratura. Inoltre, non è di per sé un metodo per proteggere un segreto facile da indovinare. Per esempio, l’hashing di una password breve non la rende difficile da indovinare se un attaccante può calcolare l’hash di candidati comuni. La memorizzazione delle password richiede tecniche distinte, come i salt e funzioni di hashing delle password progettate appositamente e deliberatamente costose da calcolare. Questi dettagli operativi esulano da questo corso, ma la distinzione evita un equivoco frequente.
Resistenza alla seconda preimmagine e alle collisioni
La resistenza alla seconda preimmagine riguarda la difficoltà di trovare un input diverso con lo stesso digest di un input specificato. La resistenza alle collisioni riguarda la difficoltà di trovare due input distinti qualsiasi che producano lo stesso digest. Poiché gli input possibili sono infiniti, mentre gli output sono finiti, in linea di principio devono esistere collisioni. Una funzione hash crittografica ben progettata rende estremamente difficile individuare collisioni utili. Un output di 256 bit non implica una resistenza alle collisioni di 256 bit: l’effetto compleanno offre alle ricerche generiche di collisioni un limite inferiore di sicurezza rispetto alle ricerche di preimmagini. Gli studenti dovrebbero saper riconoscere i tre termini senza considerarli intercambiabili, né presumere che ogni algoritmo sia rimasto ugualmente sicuro nel tempo.
I byte sottoposti a hashing sono determinanti
Due persone possono calcolare l’hash di quello che sembra lo stesso documento e ottenere digest diversi se non usano byte identici. Un file può avere terminazioni di riga diverse; un paragrafo copiato può contenere una rappresentazione Unicode diversa dello stesso carattere visibile; un foglio di calcolo può contenere metadati nascosti. Le funzioni hash non capiscono che due file si assomigliano. Elaborano sequenze di byte specifiche. Prima di confrontare i risultati, occorre identificare il formato del file, la codifica dei caratteri, l’ambito preciso dell’input e l’algoritmo di hashing. Registrare questi dettagli fa parte di una traccia di audit riproducibile.
Si consideri un contratto in formato PDF. Calcolare l’hash del file PDF esatto può aiutare a rilevare modifiche successive al file, comprese quelle non visibili sulla pagina. Questo, da solo, non dimostra che il contratto sia stato validamente stipulato, che un firmatario ne abbia compreso i termini o che il file fosse corretto al momento della prima ricezione. Un’organizzazione può registrare un digest insieme alla fonte, all’ora di raccolta, al responsabile e alla cronologia della gestione. Il digest supporta un’affermazione sulla continuità del file; i dati circostanti ne supportano la provenienza. Nessuno dei due va confuso con una certificazione indipendente del contenuto.
Usi comuni nei sistemi di asset digitali
Gli identificatori delle transazioni si basano spesso su hash di una rappresentazione della transazione definita dal protocollo. Un identificatore consente a nodi e analisti di fare riferimento a uno specifico oggetto di dati; il suo calcolo preciso dipende dalla rete. In Bitcoin, il convenzionale transaction ID (txid) è calcolato dalla serializzazione della transazione senza witness mediante una doppia applicazione di SHA-256, mentre un witness transaction identifier (wtxid) include nella serializzazione il witness. Questa distinzione è importante quando si confrontano gli output dei software. Altre reti possono usare un algoritmo diverso o trattare una firma come identificatore di ricerca della transazione. Non bisogna mai presumere che tutte le stringhe etichettate come “hash della transazione” siano state calcolate nello stesso modo.
Gli hash consentono anche di creare commitment compatti a raccolte di record. Un albero di Merkle combina gli hash in livelli, fino a ottenere un digest, detto radice di Merkle, che rappresenta le foglie incluse secondo una costruzione specificata. Una prova può quindi dimostrare che un determinato elemento faceva parte della raccolta a cui si è dato un commitment, senza trasmettere tutti gli altri elementi. Ciò dimostra l’inclusione rispetto a una radice nota; non stabilisce il significato dell’elemento nel mondo reale. Il modulo precedente ha introdotto il ruolo degli hash nel collegamento dei blocchi. La lezione trasferibile qui è che i commitment basati su hash sono affermazioni precise e circoscritte sulle relazioni tra dati.
Gli algoritmi hash non sono intercambiabili
Nomi simili possono nascondere differenze tecniche. NIST FIPS 202, SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions, definisce, tra le altre funzioni, SHA3-256. La costruzione Keccak-256, ampiamente utilizzata da Ethereum, è correlata alla famiglia Keccak, ma non dovrebbe essere considerata con leggerezza identica byte per byte alla SHA3-256 standardizzata: le convenzioni di padding sono diverse. Allo stesso modo, SHA-256 e doppio SHA-256 sono calcoli distinti. Un analista che verifica un valore deve usare l’algoritmo e la codifica esatti specificati dal protocollo pertinente, invece di scegliere dal menu di un software una funzione hash che gli è familiare.
| Funzione | Domanda tipica | Limite importante |
|---|---|---|
| Digest di file | Questi byte esatti sono cambiati? | Non stabilisce la veridicità dei fatti |
| ID transazione | A quale oggetto del protocollo si fa riferimento? | Il calcolo dipende dalla rete |
| Radice di Merkle | Un elemento appartiene a questo insieme sottoposto a commitment? | Richiede una radice di riferimento attendibile |
| Hash di password | Un segreto candidato corrisponde? | Richiede una progettazione dedicata alla memorizzazione delle password |
Una procedura pratica di confronto
- Identificare con precisione l’oggetto da confrontare: un file completo, il suo contenuto, una transazione serializzata o un indirizzo visualizzato.
- Registrare l’algoritmo e la rappresentazione utilizzati, compresi codifica, rete e campi inclusi o esclusi.
- Calcolare o ottenere il digest in modo indipendente e confrontare il valore completo anziché un prefisso abbreviato.
- Se il risultato è diverso, esaminare le differenze a livello di byte o di rappresentazione prima di trarre conclusioni su frodi o alterazioni.
Talvolta il software mostra soltanto i primi e gli ultimi caratteri di un digest lungo. Queste abbreviazioni possono aiutare una persona a individuare un record, ma non sono sufficienti come prova di una corrispondenza esatta. Un checksum usato per individuare errori di digitazione può essere molto più breve e non è la stessa cosa di un digest crittografico del contenuto. Per un confronto formale, conservare il digest completo e i dettagli contestuali in modo che un altro revisore possa ripetere la verifica. Le affermazioni più solide sono circoscritte: “questi byte esatti corrispondono secondo questo algoritmo specificato”, anziché “questo documento è autentico sotto ogni aspetto”.
Focus d’esame: Spiegare la dimensione fissa dell’output, la proprietà a senso unico, la differenza tra resistenza alle collisioni e resistenza alla preimmagine e perché l’hashing rileva le modifiche ai byte ma non può dimostrare l’accuratezza o l’autenticità giuridica di un record. Saper distinguere SHA-256, SHA3-256 e Keccak-256 in base ai nomi e alle specifiche e riconoscere perché è importante la serializzazione esatta dell’input.