{"id":14,"date":"2026-06-10T09:13:48","date_gmt":"2026-06-10T09:13:48","guid":{"rendered":"https:\/\/shattered.io\/it\/2026\/06\/10\/collisione-sha1\/"},"modified":"2026-06-10T09:13:48","modified_gmt":"2026-06-10T09:13:48","slug":"collisione-sha1","status":"publish","type":"post","link":"https:\/\/shattered.io\/it\/cryptography\/collisione-sha1\/","title":{"rendered":"La collisione SHA-1 di SHAttered: come \u00e8 stata infranta una funzione hash"},"content":{"rendered":"<h2 id=\"la-prima-collisione-pratica-di-sha-1\">La prima collisione pratica di SHA-1<\/h2>\n<p>Il 23 febbraio 2017 i ricercatori del CWI Amsterdam (il centro nazionale olandese per la matematica e l&#8217;informatica) e di Google annunciarono un risultato atteso da tempo e a lungo solo teorizzato: la prima collisione pratica per la funzione hash SHA-1. Il progetto prese il nome di SHAttered, un gioco di parole tra SHA e l&#8217;inglese shattered, in frantumi.<\/p>\n<p>Per la prima volta non si trattava di una previsione su carta o di una stima di costo, ma di due file reali, prodotti e resi pubblici, che condividevano lo stesso valore SHA-1 pur essendo diversi. Era la dimostrazione concreta che SHA-1 non poteva pi\u00f9 essere considerato sicuro laddove serve resistenza alle collisioni.<\/p>\n<h2 id=\"che-cose-una-collisione-e-perche-distrugge-la-fiducia\">Che cos&#8217;\u00e8 una collisione e perch\u00e9 distrugge la fiducia<\/h2>\n<p>Una funzione hash crittografica comprime un input di qualsiasi dimensione in un&#8217;impronta di lunghezza fissa. Per SHA-1 l&#8217;impronta \u00e8 lunga 160 bit. Poich\u00e9 gli input possibili sono infiniti e le impronte sono in numero finito, \u00e8 matematicamente inevitabile che esistano input diversi con la stessa impronta. La garanzia di sicurezza non \u00e8 quindi che le collisioni non esistano, ma che siano talmente difficili da trovare da risultare praticamente irraggiungibili.<\/p>\n<p>Una collisione \u00e8 esattamente questo: due messaggi distinti che producono lo stesso digest. Quando un attaccante riesce a costruirne una a piacere, l&#8217;impronta smette di identificare in modo univoco un contenuto. E poich\u00e9 moltissimi sistemi di sicurezza trattano il digest come se fosse l&#8217;identit\u00e0 del dato, le conseguenze sono profonde.<\/p>\n<p>Conviene distinguere due nozioni che vengono spesso confuse. Trovare una seconda preimmagine significa partire da un messaggio dato e cercarne un altro con la stessa impronta: un compito difficilissimo, perch\u00e9 il primo documento \u00e8 fissato in anticipo. Trovare una collisione, invece, lascia all&#8217;attaccante la libert\u00e0 di scegliere entrambi i messaggi, e questo allarga enormemente lo spazio di manovra. Per ragioni legate alla statistica delle coincidenze (il cosiddetto paradosso del compleanno), cercare una collisione \u00e8 intrinsecamente pi\u00f9 facile che cercare una preimmagine, ed \u00e8 proprio su questo terreno pi\u00f9 debole che SHA-1 ha ceduto per primo.<\/p>\n<p>Si pensi a una firma digitale. Non si firma l&#8217;intero documento, ma il suo digest. Se un attaccante prepara due documenti con la stessa impronta, uno innocuo e uno malevolo, pu\u00f2 far firmare il primo e poi presentare il secondo: la firma resta valida per entrambi, perch\u00e9 matematicamente vede solo l&#8217;impronta condivisa. Lo stesso ragionamento vale per i certificati, per i pacchetti software firmati e per i sistemi di controllo versione che identificano gli oggetti tramite hash. Trovare una collisione significa poter sostituire un contenuto con un altro senza che i controlli se ne accorgano.<\/p>\n<h2 id=\"i-due-pdf-con-la-stessa-impronta\">I due PDF con la stessa impronta<\/h2>\n<p>La dimostrazione di SHAttered fu deliberatamente concreta e facile da verificare. I ricercatori pubblicarono due file PDF dall&#8217;aspetto diverso che, passati attraverso SHA-1, restituiscono lo stesso identico valore:<\/p>\n<pre><code>38762cf7f55934b34d179ae6a4c80cadccbb7f0a\n<\/code><\/pre>\n<p>Chiunque pu\u00f2 scaricare i due documenti e calcolarne l&#8217;hash SHA-1 per constatare che coincide. Si tratta di <a href=\"https:\/\/shattered.io\/static\/shattered-1.pdf\">shattered-1.pdf<\/a> e <a href=\"https:\/\/shattered.io\/static\/shattered-2.pdf\">shattered-2.pdf<\/a>.<\/p>\n<p>Il dettaglio cruciale \u00e8 che la collisione esiste solo sotto SHA-1. Se si calcola il digest degli stessi due file con SHA-256, una funzione della famiglia SHA-2 considerata tuttora sicura, i due valori risultano completamente diversi. Questo isola con precisione il problema: non \u00e8 il formato PDF a essere difettoso, e non sono i file a essere identici, ma \u00e8 proprio SHA-1 come algoritmo a non offrire pi\u00f9 la resistenza alle collisioni che ci si aspetta da una funzione hash crittografica.<\/p>\n<p>La scelta del PDF non fu casuale. Il formato consente di inserire contenuti che non vengono mostrati a schermo, e questo lascia margine per costruire due documenti dall&#8217;aspetto differente che convergono comunque sullo stesso digest. \u00c8 il tipo di costruzione che rende l&#8217;attacco pericoloso nel mondo reale, dove un avversario vuole produrre coppie utili e non solo dati casuali.<\/p>\n<p>Vale la pena soffermarsi su un aspetto tecnico. L&#8217;attacco di SHAttered \u00e8 quello che si definisce una collisione a prefisso identico: i due file possono iniziare con lo stesso blocco di dati e divergere a partire da una porzione costruita appositamente, contenente le differenze calcolate per far collidere le impronte. In un documento ricco come un PDF, queste differenze possono essere nascoste e usate per pilotare ci\u00f2 che viene effettivamente mostrato, cos\u00ec da ottenere due versioni che appaiono distinte all&#8217;occhio umano ma identiche agli occhi di SHA-1. \u00c8 questa capacit\u00e0 di controllare il contenuto visibile, e non solo di generare due blob casuali, a trasformare una curiosit\u00e0 matematica in una minaccia operativa.<\/p>\n<h2 id=\"lo-sforzo-di-calcolo-dietro-lattacco\">Lo sforzo di calcolo dietro l&#8217;attacco<\/h2>\n<p>Dimostrare la collisione non fu affatto economico. L&#8217;attacco richiese circa 9,2 quintilioni di calcoli SHA-1, ovvero 9,2 miliardi di miliardi di operazioni. Per dare un&#8217;idea concreta di questa mole, gli autori la tradussero in tempo macchina: all&#8217;incirca 6.500 anni di CPU sommati a circa 110 anni di GPU.<\/p>\n<p>Naturalmente nessuno attese millenni. Quei tempi furono distribuiti su grandi quantit\u00e0 di hardware in parallelo, riducendo la durata effettiva a una scala gestibile per un&#8217;organizzazione dotata di risorse di calcolo importanti. Il punto, per\u00f2, non era la velocit\u00e0: era la fattibilit\u00e0. Un attacco che fino a quel momento veniva descritto come teoricamente possibile ma proibitivamente costoso si rivelava finalmente alla portata, perlomeno di chi disponeva di un&#8217;infrastruttura adeguata.<\/p>\n<p>Va sottolineato anche un aspetto economico. Il costo del calcolo tende a diminuire nel tempo, mentre le tecniche di attacco migliorano. Una collisione che nel 2017 richiedeva uno sforzo enorme sarebbe diventata progressivamente pi\u00f9 accessibile, il che rese impossibile rimandare ancora la dismissione di SHA-1.<\/p>\n<h2 id=\"le-conseguenze-la-dismissione-accelerata-di-sha-1\">Le conseguenze: la dismissione accelerata di SHA-1<\/h2>\n<p>L&#8217;effetto pi\u00f9 immediato di SHAttered fu accelerare l&#8217;abbandono di SHA-1, un processo che era gi\u00e0 stato avviato ma che la dimostrazione pratica rese improrogabile.<\/p>\n<p>Nei certificati TLS, quelli che proteggono le connessioni HTTPS, SHA-1 era gi\u00e0 in via di pensionamento da parte dei principali browser. La collisione conferm\u00f2 che la decisione era corretta e ne consolid\u00f2 l&#8217;attuazione: un certificato fondato su un algoritmo con collisioni dimostrate non pu\u00f2 garantire l&#8217;autenticit\u00e0 che dovrebbe assicurare.<\/p>\n<p>Anche il mondo del controllo versione fu toccato direttamente. Git, lo strumento pi\u00f9 diffuso per la gestione del codice sorgente, identifica i propri oggetti tramite hash SHA-1. SHAttered spinse il progetto ad aggiungere contromisure di rilevamento delle collisioni e a pianificare la transizione verso una funzione hash pi\u00f9 solida, per evitare che un attaccante potesse sostituire commit o file sfruttando coppie costruite ad arte.<\/p>\n<p>Lo stesso vale per la firma del software e dei documenti in generale. Qualsiasi sistema che si affidasse a SHA-1 per garantire che un contenuto firmato non fosse stato alterato divenne sospetto, e la migrazione verso SHA-256 e le altre varianti di SHA-2 si fece prioritaria. Il meccanismo del rischio \u00e8 diretto: una firma digitale viene applicata al digest del contenuto, non al contenuto per intero, quindi due file che collidono sotto SHA-1 condividono di fatto la stessa firma. Una firma raccolta su un documento innocuo pu\u00f2 cos\u00ec risultare valida anche su una versione malevola costruita per collidere, e l&#8217;intera garanzia di autenticit\u00e0 si svuota.<\/p>\n<p>\u00c8 utile chiarire anche ci\u00f2 che SHAttered non implica. La collisione riguarda la resistenza alle collisioni, non la resistenza alla preimmagine: l&#8217;attacco non permette, dato un digest qualsiasi gi\u00e0 esistente, di ricostruire un input che lo produca. In altre parole, un avversario non pu\u00f2 prendere l&#8217;impronta di un file altrui e fabbricare al volo un secondo file che le corrisponda. Deve invece pianificare in anticipo entrambi i documenti della coppia. Questa distinzione, pur importante sul piano teorico, non attenua la gravit\u00e0 del risultato per tutti gli scenari in cui chi attacca controlla i contenuti da firmare, che sono moltissimi.<\/p>\n<h2 id=\"leredita-di-shattered\">L&#8217;eredit\u00e0 di SHAttered<\/h2>\n<p>Per chi volesse approfondire i dettagli tecnici dell&#8217;attacco, gli autori hanno pubblicato l&#8217;intero studio, consultabile come <a href=\"https:\/\/shattered.io\/static\/shattered.pdf\">documento scientifico originale<\/a>.<\/p>\n<p>Al di l\u00e0 dei dettagli, la lezione di SHAttered \u00e8 duratura. Un algoritmo crittografico non viene infranto da un giorno all&#8217;altro: prima compaiono debolezze teoriche, poi attacchi sempre meno costosi sulla carta, infine la dimostrazione pratica. Quando quest&#8217;ultima arriva, \u00e8 gi\u00e0 tardi per chi non ha migrato in tempo. SHA-1 ha seguito esattamente questo percorso, e la sua storia ricorda perch\u00e9 le scelte crittografiche vadano riviste con anticipo, prima che la teoria diventi realt\u00e0 operativa.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La prima collisione pratica di SHA-1 Il 23 febbraio 2017 i ricercatori del CWI Amsterdam (il centro nazionale olandese per la matematica e l&#8217;informatica) e di Google annunciarono un risultato\u2026<\/p>\n","protected":false},"author":2,"featured_media":21,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cryptography"],"_links":{"self":[{"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":0,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/media\/21"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/it\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}