Che cos’è una firma digitale

Una firma digitale è un meccanismo crittografico che permette di verificare due cose su un messaggio: che provenga davvero da chi dichiara di averlo inviato (autenticità) e che non sia stato alterato dopo la firma (integrità). A differenza di una firma autografa, che riproduce sempre lo stesso segno, una firma digitale dipende dal contenuto specifico del messaggio ed è quindi diversa per ogni documento.

Il funzionamento riposa sulla combinazione di due strumenti: una funzione hash crittografica e una coppia di chiavi asimmetriche. Capire come questi due elementi lavorano insieme è essenziale per comprendere sia la solidità delle firme digitali sia la loro vulnerabilità di fronte a una collisione come quella dimostrata da SHAttered.

Chiavi asimmetriche: privata e pubblica

La crittografia asimmetrica si basa su una coppia di chiavi matematicamente collegate: una chiave privata, che il titolare custodisce gelosamente e non condivide con nessuno, e una chiave pubblica, che può essere distribuita liberamente. Ciò che viene elaborato con la chiave privata può essere verificato con la corrispondente chiave pubblica, e viceversa, ma conoscere la chiave pubblica non permette di ricavare quella privata.

Questa asimmetria è il cuore del sistema. Solo chi possiede la chiave privata può produrre una firma valida, mentre chiunque disponga della chiave pubblica può controllarla. In questo modo la firma diventa una prova verificabile da tutti ma generabile da uno solo, ovvero il legittimo titolare.

Da questa proprietà discende anche il cosiddetto non ripudio. Poiché soltanto il titolare può aver prodotto una firma valida con la propria chiave privata, non può in seguito negare in modo credibile di averla apposta, a condizione che la chiave privata sia rimasta riservata. La custodia della chiave privata diventa quindi un punto critico dell’intero sistema: se viene rubata o esposta, un attaccante può firmare a nome della vittima, e tutte le garanzie crollano. Per questo le chiavi private vengono spesso conservate in dispositivi protetti o moduli hardware dedicati.

Il ruolo della funzione hash

Si potrebbe pensare che la firma venga applicata direttamente all’intero messaggio, ma nella pratica non è così. I documenti possono essere molto grandi, e operare con le chiavi asimmetriche su grandi quantità di dati sarebbe lento e poco pratico. La soluzione è introdurre una funzione hash crittografica.

Prima di firmare, il messaggio viene passato attraverso una funzione hash, che lo riduce a un digest di lunghezza fissa, un’impronta compatta che rappresenta il contenuto. La firma viene poi applicata a questo digest, non al messaggio intero. Il digest funge da rappresentante univoco del documento: grazie all’effetto valanga, qualsiasi modifica del messaggio, anche di un solo carattere, produce un’impronta completamente diversa.

Questo passaggio è elegante ed efficiente, ma ha una conseguenza decisiva. La sicurezza dell’intera firma dipende dalla qualità della funzione hash. Se diventa possibile trovare due messaggi diversi con lo stesso digest, la firma non distingue più i due contenuti, perché matematicamente ne vede solo l’impronta condivisa.

Come si firma un messaggio

Il processo di firma può essere descritto in pochi passaggi chiari.

Per prima cosa, il mittente calcola il digest del messaggio applicando una funzione hash crittografica, per esempio SHA-256. Ottiene così un’impronta di lunghezza fissa che rappresenta il contenuto in modo univoco.

In secondo luogo, il mittente elabora questo digest con la propria chiave privata. Il risultato è la firma digitale, un valore legato indissolubilmente sia al contenuto del messaggio (tramite il digest) sia all’identità del firmatario (tramite la chiave privata). La firma viene poi allegata o trasmessa insieme al messaggio.

Poiché solo il titolare possiede la chiave privata, solo lui può produrre quella firma per quel particolare digest. Chiunque tenti di falsificarla senza la chiave privata si scontra con un problema computazionalmente irrealizzabile.

Come si verifica una firma

La verifica è l’operazione speculare e può essere eseguita da chiunque disponga della chiave pubblica del firmatario.

Il destinatario calcola in modo indipendente il digest del messaggio ricevuto, usando la stessa funzione hash impiegata in fase di firma. Parallelamente, applica la chiave pubblica del mittente alla firma ricevuta, ricavandone il digest che era stato firmato.

A questo punto confronta i due valori. Se il digest calcolato dal messaggio coincide con quello estratto dalla firma tramite la chiave pubblica, la verifica ha successo: il messaggio proviene dal titolare della chiave privata corrispondente e non è stato alterato. Se i due valori differiscono, qualcosa non torna: o il messaggio è stato modificato dopo la firma, o la firma non è autentica. In entrambi i casi la firma viene rifiutata.

Perché una collisione minaccia le firme

È qui che la vicenda di SHAttered diventa rilevante. Poiché la firma opera sul digest e non sul messaggio intero, due documenti con la stessa impronta condividono di fatto la stessa firma. Una firma valida per il primo è automaticamente valida anche per il secondo, perché la verifica confronta soltanto i digest, che coincidono.

Si immagini il seguente scenario. Un attaccante prepara due documenti con lo stesso digest, sfruttando una collisione: uno innocuo e uno malevolo. Fa firmare il documento innocuo a una vittima, che non sospetta nulla perché il contenuto sembra legittimo. Poi presenta il documento malevolo accompagnato dalla stessa firma. Dal punto di vista matematico la firma è perfettamente valida anche per il secondo documento, perché entrambi producono la stessa impronta. La garanzia di autenticità crolla.

Questo è esattamente il pericolo che SHAttered ha reso concreto per SHA-1. Nel 2017 i ricercatori del CWI Amsterdam e di Google dimostrarono la prima collisione pratica producendo due file PDF diversi con la stessa impronta SHA-1. Da quel momento, qualsiasi schema di firma ancora basato su SHA-1 doveva essere considerato vulnerabile, perché la premessa su cui poggiava (l’impossibilità pratica di trovare collisioni) era venuta meno. La risposta naturale fu migrare verso funzioni hash resistenti alle collisioni, come quelle della famiglia SHA-2.

Certificati e firma del codice

Le firme digitali non sono un concetto astratto: sostengono strumenti quotidiani.

I certificati digitali, che autenticano i siti web nelle connessioni HTTPS, sono essenzialmente dichiarazioni firmate da un’autorità di certificazione. Il certificato lega un’identità a una chiave pubblica, e la firma dell’autorità ne garantisce l’autenticità. Anche in questo caso la firma opera su un digest, motivo per cui i certificati basati su SHA-1 sono stati progressivamente abbandonati a favore di SHA-256 dopo la dimostrazione delle collisioni.

La firma del codice protegge il software distribuito. Quando uno sviluppatore firma un eseguibile, gli utenti possono verificare che il file provenga davvero da lui e non sia stato manomesso. Una collisione nella funzione hash sottostante aprirebbe la porta a un attacco in cui un file malevolo viene fatto passare per uno legittimo, condividendo la stessa firma di un eseguibile innocuo. È una delle ragioni per cui la solidità della funzione hash è considerata parte integrante della sicurezza della firma.

Una catena solida solo quanto il suo anello più debole

Le firme digitali offrono autenticità e integrità combinando chiavi asimmetriche e funzioni hash. Il sistema è solido, ma poggia su un presupposto: che la funzione hash impiegata sia resistente alle collisioni. Quando questo presupposto cade, come è accaduto a SHA-1 con SHAttered, l’intera garanzia vacilla. Per questo la scelta di una funzione hash sicura e aggiornata non è un dettaglio tecnico marginale, ma una condizione necessaria perché una firma digitale mantenga davvero la sua promessa.