<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Cryptography on My personal blog</title>
        <link>https://www.matteobianchi.eu/categories/cryptography/</link>
        <description>Recent content in Cryptography on My personal blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Tue, 06 Oct 2026 09:00:00 +0200</lastBuildDate><atom:link href="https://www.matteobianchi.eu/categories/cryptography/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Crittografia applicata: la serie</title>
        <link>https://www.matteobianchi.eu/p/crittografia-applicata-la-serie/</link>
        <pubDate>Tue, 04 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/crittografia-applicata-la-serie/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/crittografia-applicata-la-serie/cover.png" alt="Featured image of post Crittografia applicata: la serie" /&gt;&lt;h2 id=&#34;perché-questa-serie&#34;&gt;Perché questa serie
&lt;/h2&gt;&lt;p&gt;Usi la crittografia centinaia di volte al giorno senza pensarci: ogni sito in HTTPS, ogni messaggio
cifrato, ogni password salvata, ogni aggiornamento firmato. Quando funziona è invisibile. Quando la si
implementa male — ed è facile — i dati trapelano in silenzio, e nessun test funzionale se ne accorge.
Questa serie in &lt;strong&gt;10 capitoli&lt;/strong&gt; spiega la crittografia &lt;em&gt;applicata&lt;/em&gt;: non le dimostrazioni matematiche,
ma &lt;em&gt;quale&lt;/em&gt; primitiva usare, &lt;em&gt;perché&lt;/em&gt;, e quali errori evitare.&lt;/p&gt;
&lt;h2 id=&#34;la-regola-doro&#34;&gt;La regola d&amp;rsquo;oro
&lt;/h2&gt;&lt;p&gt;Prima di tutto il resto, una regola che vale più di ogni capitolo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Non inventare la tua crittografia, e non implementare primitive a mano.&lt;/strong&gt; Usa librerie
affermate, revisionate, e le loro impostazioni predefinite sicure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La crittografia fallisce in modi silenziosi: un nonce riusato, un confronto non a tempo costante, un
padding mal gestito. Capire &lt;em&gt;come&lt;/em&gt; funziona serve a usarla bene e a riconoscere gli errori — non a
riscriverla. Tutta la serie è pensata con questo spirito.&lt;/p&gt;
&lt;h2 id=&#34;la-mappa&#34;&gt;La mappa
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    SYM[Simmetrica&amp;lt;br/&amp;gt;AES, AEAD] --&amp;gt; HASH[Hashing&amp;lt;br/&amp;gt;integrità]
    HASH --&amp;gt; MAC[HMAC&amp;lt;br/&amp;gt;autenticità]
    MAC --&amp;gt; PW[Password&amp;lt;br/&amp;gt;hashing]
    PW --&amp;gt; ASYM[Asimmetrica&amp;lt;br/&amp;gt;RSA, ECC]
    ASYM --&amp;gt; KEX[Scambio chiavi&amp;lt;br/&amp;gt;forward secrecy]
    KEX --&amp;gt; SIG[Firme&amp;lt;br/&amp;gt;digitali]
    SIG --&amp;gt; PKI[PKI&amp;lt;br/&amp;gt;catena di fiducia]
    PKI --&amp;gt; PQC[Post-quantum]
    style SYM fill:#fde2e4,stroke:#e63946
    style PKI fill:#e8f0fe,stroke:#4361ee
&lt;/pre&gt;

&lt;p&gt;Si parte dai mattoni più semplici (cifrare e verificare l&amp;rsquo;integrità) e si sale fino a come TLS, le
firme del software e la PKI li combinano. L&amp;rsquo;ultimo capitolo guarda avanti: cosa cambia quando
arriveranno i computer quantistici.&lt;/p&gt;
&lt;h2 id=&#34;i-tre-obiettivi-della-crittografia&#34;&gt;I tre obiettivi della crittografia
&lt;/h2&gt;&lt;p&gt;Tutto ruota attorno a tre proprietà, e confonderle è l&amp;rsquo;errore concettuale più comune:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Riservatezza&lt;/strong&gt;: nessuno legge il messaggio tranne il destinatario. → cifratura.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrità&lt;/strong&gt;: il messaggio non è stato alterato. → hash, MAC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autenticità&lt;/strong&gt;: il messaggio viene davvero da chi dice. → MAC, firme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cifrare &lt;em&gt;non&lt;/em&gt; garantisce integrità; un hash &lt;em&gt;non&lt;/em&gt; garantisce autenticità. Gran parte della serie è
imparare quale strumento dà quale garanzia, e come combinarli senza lasciare buchi.&lt;/p&gt;
&lt;h2 id=&#34;a-chi-si-rivolge&#34;&gt;A chi si rivolge
&lt;/h2&gt;&lt;p&gt;A chi scrive software e deve scegliere come cifrare dati, salvare password, verificare firme — senza
essere un crittografo. Diamo per note le basi (byte, encoding, un po&amp;rsquo; di aritmetica); tutto il resto
lo costruiamo. Questa serie è il complemento naturale di temi già trattati come il
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;TLS&lt;/a&gt; e la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/certificate-transparency/&#34; &gt;Certificate Transparency&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Partiamo dal mattone più usato di tutti: la cifratura simmetrica, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Crittografia post-quantum: prepararsi ora</title>
        <link>https://www.matteobianchi.eu/p/crittografia-post-quantum/</link>
        <pubDate>Tue, 06 Oct 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/crittografia-post-quantum/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/crittografia-post-quantum/cover.png" alt="Featured image of post Crittografia post-quantum: prepararsi ora" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Tutta la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/crittografia-asimmetrica/&#34; &gt;crittografia asimmetrica&lt;/a&gt; della serie — RSA,
ECC, Diffie-Hellman, le firme — poggia su problemi che i computer classici non sanno risolvere:
fattorizzazione e logaritmo discreto. Un &lt;strong&gt;computer quantistico&lt;/strong&gt; abbastanza grande, invece, li
risolverebbe con l&amp;rsquo;algoritmo di Shor, mandando in frantumi RSA ed ECC. La macchina non esiste ancora a
quella scala. Eppure il problema è &lt;em&gt;già oggi&lt;/em&gt;, e questo capitolo chiude la serie spiegando perché e
cosa fare.&lt;/p&gt;
&lt;h2 id=&#34;cosa-si-rompe-e-cosa-no&#34;&gt;Cosa si rompe e cosa no
&lt;/h2&gt;&lt;p&gt;Una distinzione cruciale e spesso fraintesa:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Crittografia ASIMMETRICA (RSA, ECC, DH, firme)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → algoritmo di Shor: ROTTA da un computer quantistico grande
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Crittografia SIMMETRICA (AES) e HASH (SHA-2/3)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → algoritmo di Grover: solo DIMEZZA la sicurezza → AES-256 resta solido (= 128 bit post-quantum)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Il quantistico non &amp;ldquo;rompe tutto&amp;rdquo;. Contro la simmetrica, l&amp;rsquo;algoritmo di Grover offre solo un
dimezzamento della forza: raddoppiando la dimensione della chiave (usare AES-256) si resta al sicuro. A
cadere è l&amp;rsquo;&lt;strong&gt;asimmetrica&lt;/strong&gt; — proprio i meccanismi che stabiliscono chiavi e provano identità. Lì serve
una matematica nuova.&lt;/p&gt;
&lt;h2 id=&#34;harvest-now-decrypt-later&#34;&gt;&amp;ldquo;Harvest now, decrypt later&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Perché preoccuparsene se la macchina non c&amp;rsquo;è? Per un motivo che rende la minaccia &lt;em&gt;presente&lt;/em&gt;:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    T1[Oggi] --&amp;gt;|avversario registra&amp;lt;br/&amp;gt;traffico cifrato| STORE[(Archivio&amp;lt;br/&amp;gt;traffico 2026)]
    STORE --&amp;gt; T2[Fra N anni:&amp;lt;br/&amp;gt;computer quantistico]
    T2 --&amp;gt;|decifra retroattivamente&amp;lt;br/&amp;gt;ciò che fu scambiato con ECC/RSA| LEAK[Dati del 2026&amp;lt;br/&amp;gt;esposti]
    style LEAK fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Un avversario con risorse può &lt;strong&gt;registrare oggi&lt;/strong&gt; il traffico cifrato e conservarlo, in attesa della
macchina che un domani lo decifrerà. Tutto ciò che deve restare segreto &lt;em&gt;per molti anni&lt;/em&gt; — segreti di
stato, dati sanitari, proprietà intellettuale — è già a rischio oggi, anche se il quantistico arriverà
tra dieci anni. È il motivo per cui la migrazione non può aspettare che la minaccia sia operativa.&lt;/p&gt;
&lt;h2 id=&#34;i-nuovi-algoritmi&#34;&gt;I nuovi algoritmi
&lt;/h2&gt;&lt;p&gt;Il NIST ha standardizzato i primi algoritmi &lt;strong&gt;post-quantum (PQC)&lt;/strong&gt;, basati su problemi matematici
(soprattutto reticoli) che si ritengono difficili anche per i computer quantistici:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ML-KEM&lt;/strong&gt; (ex &lt;strong&gt;Kyber&lt;/strong&gt;, FIPS 203): per lo scambio/incapsulamento di chiavi — il sostituto di
(EC)DH.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ML-DSA&lt;/strong&gt; (ex &lt;strong&gt;Dilithium&lt;/strong&gt;, FIPS 204) e &lt;strong&gt;SLH-DSA&lt;/strong&gt; (SPHINCS+, basato su hash): per le firme — i
sostituti di ECDSA/RSA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hanno chiavi e messaggi più grandi dei loro predecessori ellittici, il che pesa su banda e handshake.
Per questo la migrazione è un lavoro ingegneristico, non un semplice cambio di libreria.&lt;/p&gt;
&lt;h2 id=&#34;la-migrazione-ibrida-già-iniziata&#34;&gt;La migrazione ibrida, già iniziata
&lt;/h2&gt;&lt;p&gt;La transizione non aspetta: è &lt;strong&gt;già in corso&lt;/strong&gt;, in forma ibrida. L&amp;rsquo;approccio prudente combina il
vecchio e il nuovo in un unico scambio:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Scambio di chiavi ibrido:  ECDHE (classico)  +  ML-KEM (post-quantum)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → il segreto deriva da ENTRAMBI: sei sicuro se almeno uno regge
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → protegge dal quantistico futuro E da eventuali debolezze dei nuovi algoritmi (ancora giovani)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;I browser e le librerie TLS stanno già dispiegando scambi ibridi: così la forward secrecy del
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/scambio-chiavi-forward-secrecy/&#34; &gt;capitolo sullo scambio di chiavi&lt;/a&gt; diventa anche
&lt;em&gt;post-quantum&lt;/em&gt;, e il traffico registrato oggi resta protetto anche domani. Cosa puoi fare: usare
&lt;strong&gt;AES-256&lt;/strong&gt; dove serve longevità, preferire librerie che supportano gli ibridi, e sapere &lt;em&gt;dove&lt;/em&gt; usi
crittografia asimmetrica (crypto-agility) per poterla aggiornare quando sarà il momento.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se i computer quantistici capaci di rompere RSA non esistono ancora e forse mancano molti anni, investire ora nella migrazione post-quantum non è allarmismo prematuro?&lt;/summary&gt;
&lt;p&gt;Sembra prematuro solo se guardi la data in cui la macchina diventerà operativa; diventa evidentemente
urgente appena consideri i tre orizzonti temporali che vanno &lt;em&gt;sommati&lt;/em&gt;, un ragionamento noto come
&#34;teorema di Mosca&#34;. La domanda giusta non è &#34;quando arriverà il computer quantistico?&#34; ma &#34;per quanti anni
i miei dati devono restare segreti, e quanto tempo mi serve per migrare?&#34;. Chiamiamo X gli anni di
segretezza richiesti dai dati che cifro oggi, Y gli anni che la mia organizzazione impiega a migrare
davvero tutta la crittografia (storicamente lunghissimi: pensa a quanto ci è voluto per abbandonare
SHA-1), e Z gli anni che mancano a un computer quantistico utile. Se X + Y &gt; Z, sei già in ritardo: i dati
che proteggi adesso saranno ancora sensibili quando la macchina esisterà, ma li avrai migrati troppo
tardi. Ed è qui che entra la minaccia &#34;harvest now, decrypt later&#34;, che smonta l&#39;idea di allarmismo:
l&#39;attacco non richiede che il quantistico esista &lt;em&gt;ora&lt;/em&gt;, richiede solo che un avversario registri
&lt;em&gt;ora&lt;/em&gt; il traffico cifrato e lo conservi. La cattura avviene oggi, la decifratura domani — quindi
per qualunque dato che debba restare riservato oltre l&#39;arrivo stimato della macchina, la finestra di
rischio è &lt;em&gt;già aperta&lt;/em&gt;, non si aprirà in futuro. Per un messaggio effimero che non conta più fra
un&#39;ora, ignorare il post-quantum è ragionevole; per segreti di stato, cartelle cliniche, chiavi di lungo
periodo, proprietà intellettuale, l&#39;esposizione è concreta adesso. C&#39;è poi un argomento di prudenza
ingegneristica che rende la migrazione sensata a prescindere dalle date: adottare oggi gli scambi
&lt;em&gt;ibridi&lt;/em&gt; (classico + post-quantum insieme) non comporta quasi nessun rischio — se gli algoritmi
nuovi si rivelassero deboli, ti protegge ancora quello classico; se il classico cade al quantistico, ti
protegge quello nuovo — e nel frattempo costruisci la &lt;em&gt;crypto-agility&lt;/em&gt;, cioè la capacità di sapere
dove usi la crittografia e di cambiarla rapidamente, che è un bene a sé indipendentemente dai quanti. In
breve: non è allarmismo, è pianificazione calibrata sulla longevità dei dati. Chi tratta solo dati a vita
breve può attendere; chi tratta segreti di lungo periodo e sa quanto è lenta una migrazione reale dovrebbe
aver già cominciato, perché il nemico può aver già iniziato a raccogliere.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il computer quantistico romperebbe l&amp;rsquo;asimmetrica (RSA, ECC, DH, firme) ma non la simmetrica robusta
(AES-256): la minaccia &amp;ldquo;harvest now, decrypt later&amp;rdquo; rende il problema attuale, e la risposta sono gli
algoritmi NIST post-quantum (ML-KEM, ML-DSA) dispiegati in forma ibrida, già oggi. Qui si chiude la
serie &lt;strong&gt;Crittografia applicata&lt;/strong&gt;: dai mattoni — cifrare, verificare, autenticare — fino alla fiducia e
al futuro. Il filo rosso resta quello del primo capitolo: non inventare la tua crittografia, scegli le
primitive giuste, e capiscile abbastanza da riconoscere quando qualcosa non torna.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>PKI e la catena di fiducia</title>
        <link>https://www.matteobianchi.eu/p/pki-e-fiducia/</link>
        <pubDate>Tue, 29 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/pki-e-fiducia/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/pki-e-fiducia/cover.png" alt="Featured image of post PKI e la catena di fiducia" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Due capitoli hanno lasciato aperta la stessa domanda: la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/crittografia-asimmetrica/&#34; &gt;crittografia asimmetrica&lt;/a&gt;
e le &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firme-digitali/&#34; &gt;firme&lt;/a&gt; funzionano solo se sai che una chiave pubblica
appartiene &lt;em&gt;davvero&lt;/em&gt; a chi dice. Una chiave senza identità verificata è inutile: un man-in-the-middle
ti dà la sua e tu cifri felicemente per lui. La &lt;strong&gt;PKI (Public Key Infrastructure)&lt;/strong&gt; risolve questo:
lega chiavi a identità tramite &lt;strong&gt;certificati&lt;/strong&gt; firmati da autorità fidate.&lt;/p&gt;
&lt;h2 id=&#34;il-certificato-unidentità-firmata&#34;&gt;Il certificato: un&amp;rsquo;identità firmata
&lt;/h2&gt;&lt;p&gt;Un certificato &lt;strong&gt;X.509&lt;/strong&gt; è, in sostanza, una dichiarazione firmata: &amp;ldquo;questa chiave pubblica appartiene
a questo soggetto&amp;rdquo;, con una firma di chi lo attesta.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Certificato (semplificato):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  soggetto:       www.esempio.it         ← a chi appartiene
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  chiave pubblica: 30 82 01 0a...         ← la chiave legata all&amp;#39;identità
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  validità:       dal ... al ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  emittente:      CA Intermedia X
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  FIRMA dell&amp;#39;emittente                    ← la CA garantisce il legame
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Il certificato non è segreto: è pubblico. La sua forza sta nella &lt;em&gt;firma&lt;/em&gt; dell&amp;rsquo;emittente, che puoi
verificare — a patto di fidarti dell&amp;rsquo;emittente. E qui comincia la catena.&lt;/p&gt;
&lt;h2 id=&#34;la-catena-di-fiducia&#34;&gt;La catena di fiducia
&lt;/h2&gt;&lt;p&gt;Nessuna singola autorità firma direttamente ogni certificato del mondo. La fiducia è gerarchica:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    ROOT[Root CA&amp;lt;br/&amp;gt;autofirmata, nel trust store&amp;lt;br/&amp;gt;del tuo SO/browser] --&amp;gt;|firma| INT[CA Intermedia]
    INT --&amp;gt;|firma| LEAF[Certificato del sito&amp;lt;br/&amp;gt;www.esempio.it]
    LEAF -.verifico risalendo.-&amp;gt; INT
    INT -.fino a una radice&amp;lt;br/&amp;gt;che già mi fido.-&amp;gt; ROOT
    style ROOT fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Il tuo sistema operativo e il browser contengono un &lt;strong&gt;trust store&lt;/strong&gt;: un insieme di poche centinaia di
&lt;em&gt;root CA&lt;/em&gt; di cui ti fidi a priori. Quando visiti un sito, il browser riceve il certificato foglia e la
catena di intermedie, e verifica ogni firma risalendo fino a una radice fidata. Se la catena regge e
tutto è valido (nome corretto, non scaduto, non revocato), la connessione è autenticata. È ciò che
avviene a ogni handshake &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;TLS&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&#34;il-punto-debole-la-revoca&#34;&gt;Il punto debole: la revoca
&lt;/h2&gt;&lt;p&gt;Cosa succede se una chiave privata viene compromessa &lt;em&gt;prima&lt;/em&gt; della scadenza del certificato? Va
&lt;strong&gt;revocata&lt;/strong&gt;. Ma la revoca è storicamente il tallone d&amp;rsquo;Achille della PKI:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;CRL (liste di revoca)  → grandi, scaricate di rado: lente ad aggiornarsi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OCSP (query online)    → una richiesta per certificato: lenta, e un problema di privacy
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OCSP stapling          → il server allega la prova di non-revoca: meglio
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tendenza moderna       → certificati a VITA BREVE (es. 90 giorni, Let&amp;#39;s Encrypt) + automazione
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La direzione vincente è ridurre il problema alla fonte: certificati a &lt;strong&gt;vita breve&lt;/strong&gt;, rinnovati
automaticamente. Se un certificato dura 90 giorni, una compromissione ha una finestra corta anche
senza revoca tempestiva — lo stesso principio delle credenziali effimere visto per i
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/gestione-dei-segreti/&#34; &gt;segreti&lt;/a&gt; e la forward secrecy.&lt;/p&gt;
&lt;h2 id=&#34;il-rischio-sistemico-una-ca-compromessa&#34;&gt;Il rischio sistemico: una CA compromessa
&lt;/h2&gt;&lt;p&gt;Tutta la PKI poggia sulla fiducia nelle CA. Una CA compromessa o disonesta può emettere un certificato
valido per &lt;em&gt;qualsiasi&lt;/em&gt; dominio, abilitando un man-in-the-middle che il browser accetterebbe. È un
rischio reale, già successo. La difesa è la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/certificate-transparency/&#34; &gt;Certificate Transparency&lt;/a&gt;:
ogni certificato emesso finisce in log pubblici append-only, così un&amp;rsquo;emissione fraudolenta per il tuo
dominio è &lt;em&gt;visibile&lt;/em&gt; e rilevabile, anche se tecnicamente valida. La trasparenza non impedisce l&amp;rsquo;abuso,
ma lo rende impossibile da nascondere — e questo cambia gli incentivi.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; l&#39;intero sistema poggia sul fidarsi di qualche centinaio di CA che non conosco, inserite nel mio browser da qualcun altro. Non è un modello di fiducia fragile e centralizzato?&lt;/summary&gt;
&lt;p&gt;Sì, è fragile e in parte centralizzato, e la comunità della sicurezza lo riconosce apertamente — ma è
anche il miglior compromesso pratico trovato finora per un problema che, su scala planetaria, non ha
soluzioni perfette, e nel tempo è stato rinforzato proprio nei punti che citi. Partiamo dal problema di
fondo: miliardi di persone devono poter verificare l&#39;identità di milioni di siti che non hanno mai
contattato, senza un incontro preliminare. Qualunque soluzione richiede un &lt;em&gt;punto di partenza di
fiducia&lt;/em&gt; comune, perché la fiducia non si crea dal nulla. Le alternative teoriche hanno tutte difetti
peggiori alla scala: la verifica manuale delle impronte (come SSH al primo accesso) non scala a un web che
visiti a centinaia di domini nuovi; la ragnatela di fiducia di PGP, dove ti fidi di chi è fidato dai tuoi
contatti, è elegante ma troppo complessa per l&#39;utente medio e con una copertura disomogenea. La PKI
gerarchica ha vinto perché delega il lavoro di verifica a entità specializzate e lo ammortizza su tutti.
Ora, i difetti che sollevi sono reali e sono stati attaccati su più fronti. Primo, &#34;non conosco quelle
CA&#34;: vero, ma non sei tu a doverle fidare alla cieca — i gestori dei trust store (i produttori di sistemi
operativi e browser) applicano programmi di root rigorosi, con audit, requisiti tecnici e il potere di
&lt;em&gt;espellere&lt;/em&gt; una CA che si comporta male, cosa successa a CA importanti che hanno emesso certificati
impropri. La fiducia non è eterna, è condizionata e revocabile. Secondo, &#34;una CA può emettere per
qualsiasi dominio&#34;: questo era il buco più grave, ed è proprio ciò che la Certificate Transparency ha
chiuso rendendo &lt;em&gt;pubblica e verificabile&lt;/em&gt; ogni emissione — un certificato fraudolento per la tua
banca non può più essere emesso di nascosto, comparirebbe nei log monitorati. In aggiunta, meccanismi
come i record CAA permettono a un dominio di dichiarare &lt;em&gt;quali&lt;/em&gt; CA possono emettere per lui,
restringendo la superficie. Terzo, la centralizzazione: è mitigata dal fatto che le root sono molte e
indipendenti, e che errori di una non compromettono le altre. Resta vero che un attaccante con risorse
statali, capace di piegare o compromettere una CA fidata, è una minaccia seria contro cui la PKI da sola
non basta — ed è per questo che per i casi ad altissima sensibilità si aggiungono strati come il
certificate pinning. Il quadro onesto: la PKI è un modello di fiducia imperfetto e centralizzato, ma
&lt;em&gt;sorvegliato, revocabile e reso trasparente&lt;/em&gt;, che funziona a una scala dove i modelli più
&#34;puri&#34; falliscono. Non è fidarsi ciecamente: è fidarsi di un sistema con controllori, conseguenze e, ora,
testimoni pubblici.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La PKI lega chiavi a identità tramite certificati firmati in una catena che risale a poche root fidate;
la revoca è il punto debole, mitigato dai certificati a vita breve, e il rischio di una CA compromessa
è reso visibile dalla Certificate Transparency. Con questo i mattoni della crittografia applicata sono
completi — cifratura, integrità, autenticità, scambio di chiavi, firme e fiducia. Ma tutto questo
poggia su problemi matematici che un computer quantistico potrebbe un giorno risolvere. Cosa cambia, e
cosa fare già oggi, è l&amp;rsquo;ultimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Firme digitali: autenticità e non ripudio</title>
        <link>https://www.matteobianchi.eu/p/firme-digitali/</link>
        <pubDate>Tue, 22 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/firme-digitali/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/firme-digitali/cover.png" alt="Featured image of post Firme digitali: autenticità e non ripudio" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Lo &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/scambio-chiavi-forward-secrecy/&#34; &gt;scambio di chiavi&lt;/a&gt; concorda un segreto ma
non autentica. L&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hmac-autenticazione-messaggi/&#34; &gt;HMAC&lt;/a&gt; autentica, ma è
simmetrico: chi verifica può anche forgiare. La &lt;strong&gt;firma digitale&lt;/strong&gt; è l&amp;rsquo;autenticazione &lt;em&gt;asimmetrica&lt;/em&gt;:
si firma con la chiave privata, chiunque verifica con quella pubblica, e chi verifica &lt;strong&gt;non&lt;/strong&gt; può
creare firme. È il meccanismo dietro i certificati TLS, la &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firma-artefatti-sigstore/&#34; &gt;firma del software&lt;/a&gt;,
i commit firmati, gli aggiornamenti verificati.&lt;/p&gt;
&lt;h2 id=&#34;tre-garanzie-in-una&#34;&gt;Tre garanzie in una
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    M[Messaggio] --&amp;gt; H[&amp;#34;H(messaggio)&amp;#34;]
    H --&amp;gt; S[Firma con&amp;lt;br/&amp;gt;chiave PRIVATA]
    S --&amp;gt; SIG[Firma]
    SIG --&amp;gt; V[Verifica con&amp;lt;br/&amp;gt;chiave PUBBLICA]
    M --&amp;gt; V
    V --&amp;gt; OK{Valida?}
    style S fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Una firma valida garantisce contemporaneamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autenticità&lt;/strong&gt;: viene da chi possiede la chiave privata corrispondente a quella pubblica.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrità&lt;/strong&gt;: il messaggio non è stato alterato (la firma non combacerebbe più).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non ripudio&lt;/strong&gt;: il firmatario non può negare di aver firmato — proprietà che l&amp;rsquo;HMAC &lt;em&gt;non&lt;/em&gt; ha,
perché lì anche il verificatore conosce la chiave e avrebbe potuto produrre il tag.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il non ripudio è ciò che distingue la firma dal MAC: con una firma, solo &lt;em&gt;una&lt;/em&gt; persona al mondo poteva
produrla.&lt;/p&gt;
&lt;h2 id=&#34;perché-si-firma-lhash&#34;&gt;Perché si firma l&amp;rsquo;hash
&lt;/h2&gt;&lt;p&gt;Non si firma mai il messaggio intero, ma il suo &lt;strong&gt;hash&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firma = Sign(chiave_privata, H(messaggio))
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 1. efficienza: l&amp;#39;asimmetrica è lenta → firmi 32 byte di hash, non 2 GB di file
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# 2. la sicurezza della firma eredita dalla resistenza alle collisioni dell&amp;#39;hash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;È anche il motivo per cui un hash rotto rovina la firma: se un attaccante trova due messaggi con lo
stesso hash (&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hashing-e-integrita/&#34; &gt;collisione&lt;/a&gt;), una firma valida per uno vale
anche per l&amp;rsquo;altro. Per questo le firme usano SHA-256 o più, mai SHA-1.&lt;/p&gt;
&lt;h2 id=&#34;ecdsa-eddsa-e-il-pericolo-del-nonce&#34;&gt;ECDSA, EdDSA e il pericolo del nonce
&lt;/h2&gt;&lt;p&gt;Gli algoritmi di firma su curve ellittiche:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ECDSA&lt;/strong&gt;: lo standard diffuso. Ha un punto delicato: richiede un valore casuale ($k$, un nonce) per
&lt;em&gt;ogni&lt;/em&gt; firma, e quel valore deve essere unico e imprevedibile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EdDSA (Ed25519)&lt;/strong&gt;: progettato per eliminare proprio quel rischio. È deterministico (il nonce deriva
da chiave e messaggio), veloce, con chiavi corte. &lt;strong&gt;È la scelta preferibile oggi.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il pericolo del nonce in ECDSA non è teorico:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nonce k riusato o prevedibile in ECDSA → la chiave PRIVATA si ricava dalle firme
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  (è successo davvero: console di gioco, wallet — chiavi estratte da firme con k debole)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ un motivo in più per preferire Ed25519, che rende il nonce deterministico e sicuro by design.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Riusare — o anche solo generare male — il nonce $k$ permette di calcolare la chiave privata partendo
dalle firme pubbliche. È accaduto a sistemi reali. EdDSA toglie l&amp;rsquo;arma dalle mani di chi implementa.&lt;/p&gt;
&lt;h2 id=&#34;firma-non-è-cifratura&#34;&gt;Firma non è cifratura
&lt;/h2&gt;&lt;p&gt;Un equivoco comune (&amp;ldquo;firmare = cifrare con la privata&amp;rdquo;). Concettualmente sono operazioni distinte, con
scopi opposti: la cifratura protegge la &lt;em&gt;riservatezza&lt;/em&gt; (nasconde), la firma protegge
&lt;em&gt;autenticità e integrità&lt;/em&gt; (non nasconde nulla, un messaggio firmato è in chiaro). Gli standard moderni
le trattano come primitive separate. Usa una libreria che offre &amp;ldquo;firma&amp;rdquo; e &amp;ldquo;verifica&amp;rdquo; esplicite, non
costruzioni fatte a mano.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; il &#34;non ripudio&#34; vale davvero in pratica? Se qualcuno mi ruba la chiave privata, può firmare a mio nome — quindi come fa una firma a provare che sono stato io?&lt;/summary&gt;
&lt;p&gt;Hai colto la tensione esatta tra la proprietà &lt;em&gt;crittografica&lt;/em&gt; e la proprietà &lt;em&gt;legale/pratica&lt;/em&gt;
del non ripudio, e vale la pena separarle perché è lì che nascono i fraintendimenti. Dal punto di vista
crittografico, il non ripudio afferma una cosa precisa e vera: una firma valida poteva essere prodotta
&lt;em&gt;solo&lt;/em&gt; da chi possedeva la chiave privata, perché nessun altro — nemmeno chi verifica, a differenza
dell&#39;HMAC — è matematicamente in grado di generarla. Questo è forte e reale: la firma lega in modo
infalsificabile un messaggio a una specifica chiave privata. Ma, e qui sta il tuo punto, lega il messaggio
alla &lt;em&gt;chiave&lt;/em&gt;, non direttamente alla &lt;em&gt;persona&lt;/em&gt;; il ponte tra &#34;questa chiave&#34; e &#34;questa
persona&#34; non è crittografico, è organizzativo e dipende interamente dalla premessa che la chiave privata
sia rimasta sotto il controllo esclusivo del suo titolare. Se quella premessa cade — chiave rubata,
copiata, usata da un malware, custodita male — allora la firma prova ancora che &#34;la chiave ha firmato&#34;, ma
non più che &#34;la persona ha voluto firmare&#34;. Ecco perché il non ripudio nella pratica non è una proprietà
che la matematica ti regala da sola, è il risultato di un sistema attorno alla chiave: custodia in
hardware non esportabile (smartcard, HSM, Secure Enclave) così la chiave non lascia mai il dispositivo;
protezione d&#39;uso (PIN, biometria) così il possesso del dispositivo non basta; e soprattutto meccanismi di
&lt;em&gt;revoca&lt;/em&gt; e &lt;em&gt;timestamp&lt;/em&gt;. La revoca è decisiva: quando sospetti una compromissione, dichiari
la chiave revocata a una certa data, e da quel momento le firme non sono più accettate; i timestamp fidati
permettono di stabilire se una firma è stata prodotta &lt;em&gt;prima&lt;/em&gt; della revoca (valida) o dopo (da
rigettare). È la stessa logica della PKI che vedremo nel prossimo capitolo. Quindi la risposta onesta: la
firma fornisce un non ripudio crittografico robusto &lt;em&gt;condizionato&lt;/em&gt; alla sicurezza della chiave
privata, e trasformarlo in non ripudio affidabile nel mondo reale richiede di proteggere la chiave in modo
che &#34;possedere la chiave&#34; coincida davvero con &#34;essere la persona&#34;, più l&#39;infrastruttura di revoca per
gestire i casi in cui quella coincidenza si rompe. Non è un difetto della firma: è il confine tra ciò che
la crittografia può garantire (chi ha la chiave) e ciò che deve garantire il sistema (chi è la persona).&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Le firme digitali danno autenticità, integrità e non ripudio: si firma l&amp;rsquo;hash con la chiave privata, si
verifica con la pubblica, e Ed25519 è preferibile a ECDSA perché elimina il rischio del nonce che ha
già svuotato chiavi reali. Ma resta il nodo sollevato dal capitolo sull&amp;rsquo;asimmetrica e qui sul non
ripudio: &lt;em&gt;di quale chiave pubblica mi fido, e perché?&lt;/em&gt; Legare una chiave a un&amp;rsquo;identità è il compito
della PKI, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Scambio di chiavi e forward secrecy</title>
        <link>https://www.matteobianchi.eu/p/scambio-chiavi-forward-secrecy/</link>
        <pubDate>Tue, 15 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/scambio-chiavi-forward-secrecy/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/scambio-chiavi-forward-secrecy/cover.png" alt="Featured image of post Scambio di chiavi e forward secrecy" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;La &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/crittografia-asimmetrica/&#34; &gt;crittografia asimmetrica&lt;/a&gt; può consegnare una
chiave di sessione cifrandola con la chiave pubblica del destinatario. Funziona, ma ha un difetto
grave: se un giorno la chiave privata trapela, un attaccante che aveva &lt;em&gt;registrato&lt;/em&gt; tutto il traffico
passato può ora decifrarlo &lt;em&gt;tutto&lt;/em&gt;, retroattivamente. Lo scambio di chiavi &lt;strong&gt;Diffie-Hellman&lt;/strong&gt; offre un
modo migliore di concordare un segreto — e, nella sua forma effimera, elimina proprio questo rischio.&lt;/p&gt;
&lt;h2 id=&#34;diffie-hellman-un-segreto-che-non-viaggia-mai&#34;&gt;Diffie-Hellman: un segreto che non viaggia mai
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;idea è contro-intuitiva: due parti concordano un segreto condiviso &lt;em&gt;parlando su un canale pubblico&lt;/em&gt;,
senza mai trasmettere il segreto. La metafora dei colori:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    A[Alice: colore&amp;lt;br/&amp;gt;segreto a] --&amp;gt;|mescola con base&amp;lt;br/&amp;gt;pubblica| AM[Invia A = mix]
    B[Bob: colore&amp;lt;br/&amp;gt;segreto b] --&amp;gt;|mescola con base&amp;lt;br/&amp;gt;pubblica| BM[Invia B = mix]
    AM --&amp;gt; S[Alice calcola:&amp;lt;br/&amp;gt;B mescolato con a]
    BM --&amp;gt; S2[Bob calcola:&amp;lt;br/&amp;gt;A mescolato con b]
    S --&amp;gt; SEG[Stesso segreto condiviso]
    S2 --&amp;gt; SEG
    style SEG fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Ciascuno combina il proprio segreto con il valore pubblico ricevuto dall&amp;rsquo;altro e arriva allo &lt;em&gt;stesso&lt;/em&gt;
risultato. Un osservatore vede i valori pubblici scambiati ma non riesce a ricostruire il segreto: è
il problema del logaritmo discreto a proteggerlo. In forma matematica, con base $g$ e modulo primo
$p$:&lt;/p&gt;
&lt;p&gt;$$ (g^a \bmod p)^b \equiv (g^b \bmod p)^a \equiv g^{ab} \bmod p $$&lt;/p&gt;
&lt;p&gt;Alice e Bob calcolano lo stesso $g^{ab}$; l&amp;rsquo;osservatore ha solo $g^a$ e $g^b$ e non può derivarlo. La
versione su curve ellittiche, &lt;strong&gt;ECDH&lt;/strong&gt; (con Curve25519), fa lo stesso con chiavi corte e veloci ed è
quella usata oggi.&lt;/p&gt;
&lt;h2 id=&#34;il-vero-premio-forward-secrecy&#34;&gt;Il vero premio: forward secrecy
&lt;/h2&gt;&lt;p&gt;Qui sta il salto. Se le chiavi $a$ e $b$ sono &lt;strong&gt;effimere&lt;/strong&gt; — generate nuove per ogni sessione e
buttate subito dopo — si ottiene la &lt;strong&gt;forward secrecy&lt;/strong&gt; (o perfect forward secrecy):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chiave di consegna statica (RSA): registro il traffico oggi, rubo la chiave fra 2 anni → decifro TUTTO
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Diffie-Hellman EFFIMERO (ECDHE):  ogni sessione ha un segreto nuovo, già distrutto
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → rubare la chiave di oggi NON decifra le sessioni passate: i loro segreti non esistono più
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La forward secrecy spezza il legame tra la compromissione futura e le conversazioni passate. È il
motivo per cui il &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;TLS&lt;/a&gt; moderno (1.3) usa &lt;em&gt;solo&lt;/em&gt; scambi
effimeri (ECDHE): registrare traffico cifrato oggi nella speranza di decifrarlo domani —
l&amp;rsquo;attacco &amp;ldquo;harvest now, decrypt later&amp;rdquo; — diventa inutile contro le chiavi già distrutte.&lt;/p&gt;
&lt;h2 id=&#34;dh-autentica-no--e-serve-saperlo&#34;&gt;DH autentica? No — e serve saperlo
&lt;/h2&gt;&lt;p&gt;Diffie-Hellman concorda un segreto, ma &lt;strong&gt;non autentica&lt;/strong&gt; chi c&amp;rsquo;è dall&amp;rsquo;altra parte. Da solo è
vulnerabile al man-in-the-middle: un attaccante nel mezzo fa uno scambio DH con ciascuna parte e le
collega. Per questo DH va &lt;em&gt;combinato&lt;/em&gt; con l&amp;rsquo;autenticazione — le &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firme-digitali/&#34; &gt;firme digitali&lt;/a&gt;
del prossimo capitolo, che in TLS provano l&amp;rsquo;identità del server mentre ECDHE stabilisce il segreto.
Scambio di chiavi e autenticazione sono due compiti distinti, e servono entrambi.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se la forward secrecy è così importante, perché è esistito a lungo (e in parte esiste ancora) il modello con chiave statica senza di essa? Dov&#39;è il compromesso?&lt;/summary&gt;
&lt;p&gt;Il modello a chiave statica non è sopravvissuto per stupidità, ma per una serie di compromessi concreti
che all&#39;epoca pesavano e in parte pesano ancora — ed è utile capirli per vedere perché il vento è
definitivamente cambiato. Primo, il costo computazionale: generare una nuova coppia di chiavi effimere a
&lt;em&gt;ogni&lt;/em&gt; handshake costa CPU, e quando i server erano meno potenti e il traffico HTTPS cresceva, la
tentazione di riusare una chiave statica (nessuna generazione per sessione, possibilità di cifrare la
chiave di sessione con RSA una volta) era un risparmio reale. Con l&#39;accelerazione hardware e con ECDHE su
Curve25519 — velocissimo — questo costo oggi è trascurabile, e l&#39;argomento è caduto. Secondo, e meno
ovvio, la &lt;em&gt;visibilità&lt;/em&gt;: in molte reti aziendali e data center si erano costruiti strumenti di
sicurezza e debugging che decifravano passivamente il traffico TLS possedendo la chiave privata del
server — ispezione, IDS, troubleshooting. La forward secrecy rompe deliberatamente questa capacità:
proprio perché nessuna chiave statica decifra le sessioni, quegli strumenti passivi smettono di
funzionare, e questo ha generato resistenza da parte di chi ci faceva affidamento. La risposta corretta è
stata spostare quelle funzioni a un modello diverso (terminazione TLS esplicita su un proxy che partecipa
all&#39;handshake, non intercettazione passiva), ma la transizione ha avuto attrito. Terzo, la complessità
dello stato: le chiavi effimere vanno generate con buona entropia e gestite correttamente per sessione, e
un&#39;implementazione sciatta può introdurre bug. Detto tutto questo, il compromesso oggi è nettamente a
favore della forward secrecy, e non per moda: la minaccia &#34;harvest now, decrypt later&#34; è diventata
concreta — avversari con risorse registrano oggi traffico cifrato scommettendo di poterlo decifrare
domani, per furto di chiave o per i computer quantistici futuri. Contro questa minaccia la chiave statica
è un disastro (un furto futuro apre tutto il passato), mentre l&#39;effimero la neutralizza alla radice. Per
questo TLS 1.3 ha &lt;em&gt;eliminato&lt;/em&gt; gli scambi senza forward secrecy, non li ha solo sconsigliati: il
piccolo costo residuo non giustifica più l&#39;enorme rischio retroattivo. Il compromesso esisteva, ma gli
sviluppi — hardware veloce, curve efficienti, minacce di lungo periodo — l&#39;hanno risolto in un&#39;unica
direzione.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Diffie-Hellman fa concordare un segreto su un canale pubblico senza mai trasmetterlo, ed ECDHE
(effimero, su Curve25519) aggiunge la forward secrecy: compromettere una chiave futura non apre le
sessioni passate. Ma DH non autentica: va combinato con un meccanismo che provi &lt;em&gt;chi&lt;/em&gt; c&amp;rsquo;è dall&amp;rsquo;altra
parte — firmando con la chiave privata ciò che chiunque può verificare con quella pubblica. Sono le
firme digitali, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Crittografia asimmetrica: RSA ed ECC</title>
        <link>https://www.matteobianchi.eu/p/crittografia-asimmetrica/</link>
        <pubDate>Tue, 08 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/crittografia-asimmetrica/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/crittografia-asimmetrica/cover.png" alt="Featured image of post Crittografia asimmetrica: RSA ed ECC" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Tutta la serie finora ha usato &lt;strong&gt;chiavi condivise&lt;/strong&gt;: per cifrare, verificare o autenticare, le due
parti dovevano già possedere lo stesso segreto. Ma come fai a condividere quel segreto con un server
che non hai mai contattato, su una rete ostile, &lt;em&gt;prima&lt;/em&gt; di avere un canale sicuro? È il problema della
distribuzione delle chiavi, e per decenni non ha avuto soluzione pratica. La
&lt;strong&gt;crittografia asimmetrica&lt;/strong&gt; (a chiave pubblica) lo risolve con un&amp;rsquo;idea rivoluzionaria: due chiavi
diverse ma legate.&lt;/p&gt;
&lt;h2 id=&#34;due-chiavi-una-coppia&#34;&gt;Due chiavi, una coppia
&lt;/h2&gt;&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    GEN[Generazione] --&amp;gt; PUB[Chiave pubblica&amp;lt;br/&amp;gt;la distribuisci a tutti]
    GEN --&amp;gt; PRIV[Chiave privata&amp;lt;br/&amp;gt;la custodisci, segreta]
    PUB --&amp;gt;|cifra / verifica firma| OP[Operazioni]
    PRIV --&amp;gt;|decifra / firma| OP
    style PRIV fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Le due chiavi sono matematicamente legate ma non si deducono l&amp;rsquo;una dall&amp;rsquo;altra in pratica. Due usi
speculari:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cifratura&lt;/strong&gt;: chiunque cifra con la tua chiave &lt;em&gt;pubblica&lt;/em&gt;; solo tu, con la &lt;em&gt;privata&lt;/em&gt;, decifri.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firma&lt;/strong&gt;: tu firmi con la &lt;em&gt;privata&lt;/em&gt;; chiunque verifica con la &lt;em&gt;pubblica&lt;/em&gt;. (Il capitolo sulle firme
lo approfondisce.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La chiave pubblica può stare su un cartellone: la sicurezza sta tutta nel tenere segreta la privata.&lt;/p&gt;
&lt;h2 id=&#34;la-funzione-trapdoor&#34;&gt;La funzione trapdoor
&lt;/h2&gt;&lt;p&gt;Il cuore matematico è una &lt;strong&gt;funzione trapdoor&lt;/strong&gt;: facile da calcolare in un verso, infattibile
all&amp;rsquo;inverso &lt;em&gt;a meno che&lt;/em&gt; tu non abbia un&amp;rsquo;informazione segreta (la chiave privata). RSA la costruisce
sulla fattorizzazione:&lt;/p&gt;
&lt;p&gt;$$ n = p \times q $$&lt;/p&gt;
&lt;p&gt;Moltiplicare due primi grandi $p$ e $q$ è banale; &lt;strong&gt;fattorizzare&lt;/strong&gt; $n$ per ritrovarli è infattibile se
$n$ è abbastanza grande. La chiave pubblica usa $n$; la privata sfrutta la conoscenza di $p$ e $q$. ECC
usa invece la difficoltà del &lt;em&gt;logaritmo discreto su curve ellittiche&lt;/em&gt; — problema diverso, stessa idea:
facile avanti, infattibile indietro.&lt;/p&gt;
&lt;h2 id=&#34;rsa-contro-ecc&#34;&gt;RSA contro ECC
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sicurezza equivalente a ~128 bit simmetrici:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  RSA  → chiave di ~3072 bit
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ECC  → chiave di ~256 bit   (curva P-256, o Curve25519)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ ECC ottiene la stessa sicurezza con chiavi molto più piccole: meno banda, meno CPU.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;A parità di sicurezza, ECC usa chiavi &lt;em&gt;molto&lt;/em&gt; più corte: operazioni più veloci, meno dati da
trasmettere, ideale per mobile e per il traffico di rete. Per questo i sistemi moderni preferiscono le
curve ellittiche (Curve25519, P-256), riservando RSA ai contesti dove è già radicato. In entrambi i
casi: usa dimensioni adeguate (RSA ≥ 3072 bit, curve note e sicure) e librerie affermate.&lt;/p&gt;
&lt;h2 id=&#34;lasimmetrica-non-sostituisce-la-simmetrica&#34;&gt;L&amp;rsquo;asimmetrica NON sostituisce la simmetrica
&lt;/h2&gt;&lt;p&gt;Un equivoco diffuso. La crittografia asimmetrica è &lt;strong&gt;lenta&lt;/strong&gt; e adatta solo a piccoli dati, e nessuno
cifra un file o un flusso TLS con RSA. Nella pratica si usa un modello &lt;strong&gt;ibrido&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Modello ibrido (quello reale, es. TLS):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1. asimmetrica → concorda/consegna una CHIAVE di sessione simmetrica (piccolo dato)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2. simmetrica  → cifra tutti i dati veri con AES-GCM (veloce)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ l&amp;#39;asimmetrica risolve la distribuzione della chiave, la simmetrica fa il lavoro pesante.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;L&amp;rsquo;asimmetrica serve a stabilire il segreto condiviso; poi lavora la simmetrica. I due mondi sono
complementari, non in competizione — ed è esattamente così che funziona il
&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/tls-deep-dive/&#34; &gt;TLS&lt;/a&gt;.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se la chiave pubblica basta per cifrare, come fa chi la riceve a essere sicuro che sia davvero la mia e non quella di un impostore nel mezzo?&lt;/summary&gt;
&lt;p&gt;Hai messo il dito sul vero limite della crittografia a chiave pubblica: risolve brillantemente la
&lt;em&gt;distribuzione&lt;/em&gt; del segreto, ma da sola non risolve l&#39;&lt;em&gt;autenticità&lt;/em&gt; della chiave pubblica
stessa, e senza quella l&#39;intera costruzione è vulnerabile a un attacco man-in-the-middle. Lo scenario è
esattamente quello che descrivi: vuoi cifrare per me, ma su una rete ostile un attaccante intercetta la
comunicazione e ti consegna la &lt;em&gt;sua&lt;/em&gt; chiave pubblica spacciandola per la mia. Tu cifri felicemente
con quella, lui decifra con la propria privata, legge (o altera) il messaggio, lo ri-cifra con la mia
vera chiave pubblica e me lo inoltra: nessuno dei due si accorge di nulla. La matematica asimmetrica ha
funzionato perfettamente — ha solo protetto un dialogo con la persona sbagliata. Il problema, nota, non è
crittografico ma di &lt;em&gt;fiducia&lt;/em&gt;: come lego una chiave pubblica a un&#39;identità reale di cui mi fido?
Esistono due famiglie di risposte, ed entrambe sono argomenti di capitoli successivi di questa serie.
La prima è la &lt;strong&gt;PKI&lt;/strong&gt; (public key infrastructure): una terza parte fidata, la Certificate
Authority, firma un certificato che attesta &#34;questa chiave pubblica appartiene a questo dominio/identità&#34;;
tu ti fidi della chiave perché ti fidi della CA che l&#39;ha firmata, e la catena di fiducia risale fino a
radici che il tuo sistema conosce già. È il modello del web e del TLS. La seconda è la verifica
&lt;em&gt;fuori banda&lt;/em&gt; o su base di fiducia distribuita: confrontare manualmente l&#39;impronta (fingerprint)
della chiave attraverso un canale indipendente — come fai, anche senza saperlo, accettando la fingerprint
di un host SSH al primo accesso — oppure modelli a ragnatela di fiducia come quello storico di PGP. In
ogni caso il punto da portare a casa è che la crittografia asimmetrica sposta il problema dalla
&#34;condivisione di un segreto&#34; alla &#34;autenticazione di una chiave pubblica&#34;, che è un problema più
gestibile ma non banale, e va risolto esplicitamente con la PKI o con la verifica dell&#39;impronta. Una
chiave pubblica di cui non puoi verificare l&#39;origine non è ancora sicurezza: è sicurezza in attesa di
un&#39;identità fidata a cui agganciarsi.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La crittografia asimmetrica usa due chiavi legate da una funzione trapdoor (RSA sulla fattorizzazione,
ECC sul logaritmo discreto): risolve la distribuzione del segreto, con ECC preferibile per le chiavi
più corte, e si usa in modello ibrido perché è lenta. Ma cifrare con la chiave pubblica non è il modo
migliore di concordare un segreto condiviso: esiste un meccanismo più elegante, che dà anche una
proprietà preziosa chiamata forward secrecy. È lo scambio di chiavi, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Password hashing: lentezza come virtù</title>
        <link>https://www.matteobianchi.eu/p/password-hashing-argon2/</link>
        <pubDate>Tue, 01 Sep 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/password-hashing-argon2/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/password-hashing-argon2/cover.png" alt="Featured image of post Password hashing: lentezza come virtù" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Abbiamo visto che un &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hashing-e-integrita/&#34; &gt;hash crittografico&lt;/a&gt; è progettato per
essere &lt;em&gt;veloce&lt;/em&gt;. Per le password questa è la proprietà sbagliata: la velocità lavora per l&amp;rsquo;attaccante.
Salvare le password è il caso d&amp;rsquo;uso che quasi tutti sbagliano, e lo sbaglio non si vede finché un
database non trapela — allora si scopre in un pomeriggio se erano protette davvero o solo in
apparenza. Le password richiedono un approccio opposto a tutto il resto della crittografia: la
lentezza come virtù.&lt;/p&gt;
&lt;h2 id=&#34;cosa-non-fare&#34;&gt;Cosa NON fare
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Password in chiaro          → ovvio disastro
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Cifrate (reversibili)       → la chiave è lì vicino; un furto le espone tutte
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SHA-256(password)           → miliardi di tentativi/secondo: dizionario esaurito in minuti
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SHA-256(password) senza salt → due utenti con la stessa password hanno lo stesso hash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Il punto chiave: quando un database di hash trapela, l&amp;rsquo;attaccante non &amp;ldquo;decifra&amp;rdquo; — &lt;em&gt;indovina&lt;/em&gt;. Prova
miliardi di candidati (password comuni, dizionari, brute force) e confronta gli hash. Il suo limite è
la &lt;em&gt;velocità&lt;/em&gt;. Un hash veloce come SHA-256 gli regala miliardi di tentativi al secondo.&lt;/p&gt;
&lt;h2 id=&#34;salt-contro-il-precalcolo&#34;&gt;Salt: contro il precalcolo
&lt;/h2&gt;&lt;p&gt;Un &lt;strong&gt;salt&lt;/strong&gt; è un valore casuale, unico per ogni password, memorizzato accanto all&amp;rsquo;hash (non è
segreto). Si hasha &lt;code&gt;salt + password&lt;/code&gt;. Due effetti:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    A[Senza salt] --&amp;gt; A1[Stessa password&amp;lt;br/&amp;gt;→ stesso hash] --&amp;gt; A2[Rainbow table:&amp;lt;br/&amp;gt;hash precalcolati&amp;lt;br/&amp;gt;riutilizzabili su tutti]
    B[Con salt unico] --&amp;gt; B1[Stessa password&amp;lt;br/&amp;gt;→ hash DIVERSI] --&amp;gt; B2[Precalcolo inutile:&amp;lt;br/&amp;gt;ogni hash va attaccato&amp;lt;br/&amp;gt;singolarmente]
    style A2 fill:#fde2e4,stroke:#e63946
    style B2 fill:#e8f0fe,stroke:#4361ee
&lt;/pre&gt;

&lt;p&gt;Il salt rende inutili le &lt;strong&gt;rainbow table&lt;/strong&gt; (tabelle di hash precalcolati) e impedisce di vedere quali
utenti condividono la stessa password. Ma non rallenta i tentativi: per quello serve altro.&lt;/p&gt;
&lt;h2 id=&#34;il-costo-regolabile&#34;&gt;Il costo regolabile
&lt;/h2&gt;&lt;p&gt;Gli algoritmi di password hashing sono &lt;em&gt;deliberatamente lenti e costosi&lt;/em&gt;, con un parametro di &lt;strong&gt;costo&lt;/strong&gt;
che puoi alzare man mano che l&amp;rsquo;hardware migliora:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;bcrypt&lt;/strong&gt;: lento, con un fattore di costo (work factor). Collaudato da decenni.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;scrypt&lt;/strong&gt;: lento &lt;em&gt;e&lt;/em&gt; avido di &lt;strong&gt;memoria&lt;/strong&gt; (memory-hard), per neutralizzare le GPU.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Argon2&lt;/strong&gt;: vincitore della Password Hashing Competition, regolabile su tempo, memoria e
parallelismo. La variante &lt;strong&gt;Argon2id&lt;/strong&gt; è la raccomandazione di oggi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;idea della &lt;em&gt;memory-hardness&lt;/em&gt; è cruciale: le GPU e gli ASIC hanno tantissimi core ma poca memoria per
core. Un algoritmo che richiede, diciamo, 64 MB per ogni tentativo annulla il vantaggio dell&amp;rsquo;hardware
parallelo, che è l&amp;rsquo;arma principale dell&amp;rsquo;attaccante.&lt;/p&gt;
&lt;h2 id=&#34;tararlo-bene&#34;&gt;Tararlo bene
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Obiettivo: un singolo hash impiega ~0,1–0,5s e usa decine di MB di RAM
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → per te (un login) è impercettibile
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  → per l&amp;#39;attaccante (miliardi di tentativi) è proibitivo in tempo E in costo hardware
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Rivaluta i parametri periodicamente: l&amp;#39;hardware migliora, il costo va alzato.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Il parametro va scelto in base alla &lt;em&gt;tua&lt;/em&gt; infrastruttura: abbastanza alto da far male all&amp;rsquo;attaccante,
abbastanza basso da non rendere lento il login legittimo né esporti a un DoS. E va rivisto nel tempo.&lt;/p&gt;
&lt;h2 id=&#34;il-quadro-completo&#34;&gt;Il quadro completo
&lt;/h2&gt;&lt;p&gt;Password hashing robusto = &lt;strong&gt;Argon2id&lt;/strong&gt; (o bcrypt se Argon2 non è disponibile) + &lt;strong&gt;salt unico&lt;/strong&gt; per
utente (gestito automaticamente dalla libreria) + &lt;strong&gt;costo tarato&lt;/strong&gt; e rivisto. E, a monte, ridurre il
valore del bersaglio: MFA, &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/gestione-dei-segreti/&#34; &gt;segreti gestiti bene&lt;/a&gt;, e dove
possibile passare a meccanismi senza password. Un database con password Argon2id ben tarate, se
trapela, costa all&amp;rsquo;attaccante molto più di quanto valgano la maggior parte degli account.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se il salt è memorizzato in chiaro accanto all&#39;hash, a cosa serve? L&#39;attaccante che ruba il database ha anche i salt.&lt;/summary&gt;
&lt;p&gt;È vero che l&#39;attaccante ottiene i salt insieme agli hash, e questo confonde molti — ma il salt non è
mai stato pensato per essere segreto, e capire a cosa serve davvero chiarisce perché funziona anche se è
pubblico. Il salt difende da un attacco specifico: il &lt;em&gt;precalcolo&lt;/em&gt; e la &lt;em&gt;condivisione del lavoro
tra più password&lt;/em&gt;. Senza salt, un attaccante può fare il lavoro una volta sola e riusarlo contro
tutti: costruisce in anticipo una gigantesca tabella (rainbow table) che mappa password comuni ai loro
hash, e poi, quando ruba un database, confronta semplicemente gli hash rubati con la tabella già pronta —
nessun calcolo nuovo, risposta immediata per milioni di account. Peggio, se due utenti hanno la stessa
password hanno lo stesso hash, quindi crackarne uno li crackа tutti insieme, e vedi subito chi condivide
la password. Il salt unico per utente distrugge entrambe le scorciatoie. Poiché ogni password è hashata
con un salt diverso, la tabella precalcolata diventa inutile: dovrebbe esistere una rainbow table separata
&lt;em&gt;per ogni salt possibile&lt;/em&gt;, cioè miliardi di tabelle, il che è infattibile — il precalcolo
collassa. E due utenti con la stessa password ora hanno hash diversi, quindi l&#39;attaccante deve attaccare
ogni account &lt;em&gt;singolarmente&lt;/em&gt;, da zero, senza riusare nulla. Nota bene cosa il salt fa e cosa non
fa: non rallenta il tentativo del &lt;em&gt;singolo&lt;/em&gt; hash — quello è compito del costo regolabile di
Argon2/bcrypt — ma impedisce all&#39;attaccante di ammortizzare lo sforzo su molte password o di pre-pagarlo
prima del furto. Il fatto che sia pubblico non lo indebolisce, perché la sua forza non sta nella
segretezza ma nell&#39;essere &lt;em&gt;unico e diverso per ciascuno&lt;/em&gt;: costringe l&#39;avversario a fare lavoro
fresco e separato per ogni password, invece di un lavoro solo riutilizzabile per tutte. Salt e costo
lavorano su assi ortogonali — il salt elimina le scorciatoie orizzontali (tra password), il costo rende
caro ogni singolo tentativo verticale — ed è la combinazione dei due a rendere un database rubato poco
redditizio da attaccare.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Le password si proteggono con algoritmi lenti e memory-hard — Argon2id oggi — con salt unico per
utente e costo tarato e rivisto nel tempo: mai in chiaro, mai cifrate, mai con un hash veloce.
Finora tutta la serie ha usato &lt;em&gt;chiavi condivise&lt;/em&gt;: la stessa chiave per cifrare e decifrare, per
generare e verificare. Ma come fanno due parti che non si sono mai incontrate a condividere una chiave?
È il problema che la crittografia asimmetrica risolve, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>HMAC e autenticazione dei messaggi</title>
        <link>https://www.matteobianchi.eu/p/hmac-autenticazione-messaggi/</link>
        <pubDate>Tue, 25 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/hmac-autenticazione-messaggi/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/hmac-autenticazione-messaggi/cover.png" alt="Featured image of post HMAC e autenticazione dei messaggi" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;&lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/hashing-e-integrita/&#34; &gt;hash&lt;/a&gt; dimostra che i dati non sono cambiati, ma non
&lt;em&gt;chi&lt;/em&gt; li ha prodotti: un attaccante che controlla il canale cambia dati e hash insieme. Il &lt;strong&gt;MAC
(Message Authentication Code)&lt;/strong&gt; chiude il buco legando l&amp;rsquo;integrità a una &lt;strong&gt;chiave segreta&lt;/strong&gt;: solo chi
la possiede può generare un tag valido, e solo chi la possiede può verificarlo. È la stessa garanzia
di autenticità del tag AEAD, ma come primitiva a sé — usata ovunque ci siano token, webhook, API
firmate, cookie di sessione.&lt;/p&gt;
&lt;h2 id=&#34;hash-con-chiave-lidea-giusta-limplementazione-sbagliata&#34;&gt;Hash con chiave: l&amp;rsquo;idea giusta, l&amp;rsquo;implementazione sbagliata
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;intuizione è naturale: per autenticare, mescola la chiave segreta con il messaggio e fai l&amp;rsquo;hash.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Intuizione:  tag = H(chiave || messaggio)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# sembra ragionevole: solo chi ha la chiave produce il tag giusto...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# ...ma con gli hash della famiglia SHA-2 è VULNERABILE: length extension attack
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Il problema è un dettaglio della &lt;em&gt;costruzione&lt;/em&gt; di molti hash (Merkle–Damgård, come SHA-256): lo stato
interno è il digest stesso. Un attaccante che vede &lt;code&gt;H(chiave || messaggio)&lt;/code&gt; può &lt;strong&gt;estendere&lt;/strong&gt; il
messaggio — aggiungere dati in coda e calcolare un tag valido per &lt;code&gt;chiave || messaggio || extra&lt;/code&gt;
&lt;em&gt;senza conoscere la chiave&lt;/em&gt;. L&amp;rsquo;intuizione era giusta, la costruzione ingenua no.&lt;/p&gt;
&lt;h2 id=&#34;hmac-la-costruzione-corretta&#34;&gt;HMAC: la costruzione corretta
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;HMAC&lt;/strong&gt; risolve il length extension con una doppia applicazione dell&amp;rsquo;hash e due derivazioni della
chiave:&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    K[Chiave] --&amp;gt; I[&amp;#34;ipad ⊕ K&amp;#34;]
    K --&amp;gt; O[&amp;#34;opad ⊕ K&amp;#34;]
    M[Messaggio] --&amp;gt; H1[&amp;#34;H(ipad⊕K ‖ M)&amp;#34;]
    I --&amp;gt; H1
    H1 --&amp;gt; H2[&amp;#34;H(opad⊕K ‖ hash interno)&amp;#34;]
    O --&amp;gt; H2
    H2 --&amp;gt; TAG[Tag HMAC]
    style H2 fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;L&amp;rsquo;hash esterno &amp;ldquo;sigilla&amp;rdquo; quello interno, rendendo inefficace l&amp;rsquo;estensione. Il bello è che HMAC usa una
qualsiasi funzione di hash come componente: &lt;strong&gt;HMAC-SHA256&lt;/strong&gt; è lo standard di fatto. Non si implementa a
mano — ogni libreria crittografica lo offre pronto.&lt;/p&gt;
&lt;h2 id=&#34;il-confronto-deve-essere-a-tempo-costante&#34;&gt;Il confronto deve essere a tempo costante
&lt;/h2&gt;&lt;p&gt;Un errore sottile e frequente: verificare il tag con un confronto normale di stringhe.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# SBAGLIATO: &amp;#39;==&amp;#39; si ferma al primo byte diverso → il tempo rivela quanti byte combaciano&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tag_ricevuto&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tag_atteso&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# GIUSTO: confronto a tempo costante, indipendente da dove differiscono&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;hmac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compare_digest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tag_ricevuto&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tag_atteso&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Un confronto che termina prima quando trova un byte diverso perde pochi microsecondi in meno: misurando
quei tempi, un attaccante ricostruisce il tag byte per byte (&lt;strong&gt;timing attack&lt;/strong&gt;). Le librerie offrono un
confronto &lt;em&gt;a tempo costante&lt;/em&gt; apposta: va usato sempre per dati segreti.&lt;/p&gt;
&lt;h2 id=&#34;mac-o-firma&#34;&gt;MAC o firma?
&lt;/h2&gt;&lt;p&gt;Il MAC è &lt;strong&gt;simmetrico&lt;/strong&gt;: la stessa chiave genera e verifica. Chi verifica può anche &lt;em&gt;forgiare&lt;/em&gt;. Va
benissimo quando le due parti si fidano e condividono il segreto (la tua app che firma i propri
token). Quando invece chi verifica &lt;em&gt;non&lt;/em&gt; deve poter generare — software distribuito al pubblico,
messaggi tra parti che non si fidano — serve l&amp;rsquo;asimmetria delle firme digitali, più avanti nella
serie.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se uso già AES-GCM, che è AEAD e autentica, perché dovrei conoscere l&#39;HMAC? Non è ridondante?&lt;/summary&gt;
&lt;p&gt;Non è ridondante perché risolvono lo stesso bisogno — autenticità e integrità — in contesti diversi, e
spesso te ne serve uno dove l&#39;altro non si applica. AES-GCM autentica &lt;em&gt;ciò che cifra&lt;/em&gt;: è la scelta
giusta quando devi insieme nascondere e proteggere dei dati. Ma moltissimi casi reali richiedono di
autenticare qualcosa che &lt;em&gt;non vuoi affatto cifrare&lt;/em&gt;, ed è lì che vive l&#39;HMAC. Pensa a un token di
sessione o a un JWT firmato: il payload spesso è leggibile di proposito (il client deve sapere chi è,
quando scade), ti serve solo garantire che nessuno lo abbia alterato — HMAC sul contenuto, nessuna
cifratura. Pensa ai webhook: un servizio esterno ti invia un evento in chiaro e allega un tag
HMAC-SHA256 calcolato con un segreto condiviso, così tu verifichi che l&#39;evento venga davvero da lui e non
sia stato manomesso in transito; cifrarlo non avrebbe senso, deve poterlo leggere chi lo riceve. Pensa
alla firma delle richieste API (lo stile AWS SigV4): firmi gli header e il corpo con HMAC per provare
l&#39;autenticità della chiamata, ma il contenuto resta quello che è. In tutti questi casi vuoi
&lt;em&gt;autenticità senza riservatezza&lt;/em&gt;, e tirare dentro una cifratura AEAD solo per ottenere il tag
sarebbe goffo e spesso controproducente. C&#39;è poi la questione del livello di astrazione: AES-GCM è un
AEAD che ti dà il tag come sottoprodotto del cifrare, mentre HMAC è la primitiva di autenticazione pura,
quella che usi anche come mattone dentro costruzioni più grandi — la derivazione di chiavi (HKDF è
costruito su HMAC), i meccanismi di challenge-response, la verifica di integrità di dati già cifrati con
altro. In breve: se devi cifrare, usa un AEAD e hai l&#39;autenticazione inclusa; se devi autenticare dati
che restano in chiaro — token, webhook, richieste, messaggi tra parti che condividono un segreto — HMAC è
lo strumento diretto e corretto. Conoscerli entrambi ti fa scegliere quello giusto invece di piegare
l&#39;uno al compito dell&#39;altro.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Il MAC lega integrità e autenticità a una chiave segreta; HMAC è la costruzione corretta che evita il
length extension, con HMAC-SHA256 come standard, e va verificato con un confronto a tempo costante. Ma
il MAC è simmetrico: chi verifica può forgiare. Un caso particolare di &amp;ldquo;hash con chiave&amp;rdquo; merita un
capitolo a sé, perché quasi tutti lo sbagliano — proteggere le password, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Hashing e integrità</title>
        <link>https://www.matteobianchi.eu/p/hashing-e-integrita/</link>
        <pubDate>Tue, 18 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/hashing-e-integrita/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/hashing-e-integrita/cover.png" alt="Featured image of post Hashing e integrità" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;Il tag AEAD del &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/cifratura-simmetrica-e-aead/&#34; &gt;capitolo precedente&lt;/a&gt; ci ha dato
un primo assaggio di integrità. Ora il mattone fondamentale: la &lt;strong&gt;funzione di hash crittografica&lt;/strong&gt;.
Prende dati di qualsiasi dimensione e produce un&amp;rsquo;impronta di lunghezza fissa — il &lt;em&gt;digest&lt;/em&gt;. È ovunque:
verifica dei download, &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/firma-artefatti-sigstore/&#34; &gt;SBOM e firma del software&lt;/a&gt;,
strutture come i Merkle tree della &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/certificate-transparency/&#34; &gt;Certificate Transparency&lt;/a&gt;,
deduplicazione, blockchain. Sembra banale; le proprietà che la rendono &lt;em&gt;crittografica&lt;/em&gt; non lo sono.&lt;/p&gt;
&lt;h2 id=&#34;le-tre-proprietà&#34;&gt;Le tre proprietà
&lt;/h2&gt;&lt;p&gt;Una funzione di hash è crittografica se soddisfa tre proprietà, in difficoltà crescente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Dato un hash h = H(m):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1. Resistenza alla preimmagine   → dato h, infattibile trovare m
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2. Resistenza alla 2a preimmagine → dato m, infattibile trovare m&amp;#39; ≠ m con H(m&amp;#39;)=H(m)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  3. Resistenza alle collisioni     → infattibile trovare QUALSIASI coppia m≠m&amp;#39; con H(m)=H(m&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La resistenza alle &lt;strong&gt;collisioni&lt;/strong&gt; è la più forte e la più difficile da garantire: non devi trovare un
secondo messaggio per &lt;em&gt;uno dato&lt;/em&gt;, ma &lt;em&gt;una coppia qualsiasi&lt;/em&gt; che collida — e qui il paradosso del
compleanno gioca contro di te.&lt;/p&gt;
&lt;h2 id=&#34;il-paradosso-del-compleanno&#34;&gt;Il paradosso del compleanno
&lt;/h2&gt;&lt;p&gt;Se l&amp;rsquo;output ha $n$ bit, ci sono $2^n$ valori possibili. Ingenuamente penseresti che servano $2^n$
tentativi per una collisione. In realtà, per il paradosso del compleanno, ne bastano circa:&lt;/p&gt;
&lt;p&gt;$$ 2^{n/2} $$&lt;/p&gt;
&lt;p&gt;Un hash da 256 bit offre quindi circa $2^{128}$ di sicurezza contro le collisioni, non $2^{256}$. È il
motivo per cui gli hash moderni usano output ampi (256+ bit): la resistenza alle collisioni è
&lt;em&gt;metà&lt;/em&gt; della lunghezza in bit. Un hash da 128 bit avrebbe solo $2^{64}$ di margine — oggi aggredibile.&lt;/p&gt;
&lt;h2 id=&#34;leffetto-valanga&#34;&gt;L&amp;rsquo;effetto valanga
&lt;/h2&gt;&lt;p&gt;Una buona funzione di hash ha l&amp;rsquo;&lt;strong&gt;effetto valanga&lt;/strong&gt;: cambiare un solo bit dell&amp;rsquo;input cambia circa
&lt;em&gt;metà&lt;/em&gt; dei bit dell&amp;rsquo;output, in modo imprevedibile.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;H(&amp;#34;crittografia&amp;#34;)  = 1a2b3c... (256 bit)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;H(&amp;#34;Crittografia&amp;#34;)  = f9e8d7... (completamente diverso, pur cambiando 1 bit)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Questo rende impossibile &amp;ldquo;avvicinarsi&amp;rdquo; a un digest per tentativi incrementali: non c&amp;rsquo;è correlazione
tra la distanza degli input e quella degli output. È ciò che rende l&amp;rsquo;hash utile come impronta
infalsificabile.&lt;/p&gt;
&lt;h2 id=&#34;quale-hash-usare&#34;&gt;Quale hash usare
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Scopo generale (integrità, firme, SBOM):
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  SHA-256 / SHA-512   → solido, standard, ovunque
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  SHA-3 (Keccak)      → costruzione diversa (sponge), utile come alternativa indipendente
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;EVITARE per uso crittografico:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  MD5, SHA-1          → collisioni PRATICHE dimostrate. Rotti. Solo per checksum non ostili.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;MD5 e SHA-1 non sono &amp;ldquo;deboli&amp;rdquo;: sono &lt;strong&gt;rotti&lt;/strong&gt;. Esistono collisioni costruite in pratica (due file
diversi con lo stesso hash), quindi non offrono più alcuna garanzia contro un avversario. Vanno
eliminati da ogni contesto di sicurezza.&lt;/p&gt;
&lt;h2 id=&#34;lerrore-da-evitare-lhash-non-autentica&#34;&gt;L&amp;rsquo;errore da evitare: l&amp;rsquo;hash non autentica
&lt;/h2&gt;&lt;p&gt;Un hash dimostra che i dati &lt;em&gt;non sono cambiati per caso&lt;/em&gt; o che corrispondono a un valore noto. &lt;strong&gt;Non&lt;/strong&gt;
dimostra &lt;em&gt;chi&lt;/em&gt; li ha prodotti, né li protegge da un attaccante che può cambiare &lt;em&gt;sia&lt;/em&gt; i dati &lt;em&gt;sia&lt;/em&gt;
l&amp;rsquo;hash. Se pubblichi &lt;code&gt;file + H(file)&lt;/code&gt; e un attaccante controlla il canale, sostituisce entrambi. Per
legare l&amp;rsquo;integrità a un segreto (autenticità) serve altro: l&amp;rsquo;HMAC, prossimo capitolo. E attenzione a
un uso sbagliatissimo che tratteremo dopo — &lt;strong&gt;l&amp;rsquo;hash semplice non va usato per le password&lt;/strong&gt;.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; se SHA-256 è così solido, perché non usarlo anche per le password invece di algoritmi dedicati come Argon2?&lt;/summary&gt;
&lt;p&gt;Perché per le password la proprietà che vuoi è l&#39;&lt;em&gt;opposto&lt;/em&gt; di quella per cui SHA-256 è
progettato, ed è esattamente questa inversione di obiettivo a rendere l&#39;hash generico pericoloso lì.
SHA-256 è costruito per essere &lt;strong&gt;veloce&lt;/strong&gt;: deve calcolare l&#39;impronta di gigabyte di dati in
un istante, verificare firme e integrità senza rallentare nulla. La velocità è una virtù quando l&#39;hash
serve a fare integrità. Ma quando l&#39;hash protegge una password, la velocità diventa il regalo più grande
che puoi fare all&#39;attaccante. Pensa a cosa succede quando un database di password trapela: l&#39;attaccante ha
gli hash e vuole risalire alle password provando candidati (dizionari, password comuni, brute force su
quelle corte). Il suo collo di bottiglia è quanti tentativi al secondo riesce a fare. Con SHA-256, su
hardware moderno — e peggio su GPU o ASIC costruiti apposta — parliamo di &lt;em&gt;miliardi&lt;/em&gt; di hash al
secondo: un dizionario di tutte le password umane plausibili si esaurisce in minuti o ore. Hai usato un
hash eccellente e hai protetto quasi nulla, perché la sua velocità lavora per chi attacca. Gli algoritmi
di password hashing come Argon2, bcrypt e scrypt fanno la scelta deliberatamente opposta: sono
&lt;em&gt;lenti&lt;/em&gt; e, nel caso di Argon2 e scrypt, deliberatamente &lt;em&gt;costosi in memoria&lt;/em&gt;. Puoi tararli
perché un singolo hash impieghi, diciamo, un decimo di secondo e richieda decine di megabyte di RAM: per
te che verifichi un login è impercettibile, ma per l&#39;attaccante che deve provare miliardi di candidati
diventa proibitivo in tempo e in costo hardware, e il requisito di memoria neutralizza proprio il
vantaggio delle GPU, che hanno molti core ma poca memoria per core. In più questi algoritmi integrano il
&lt;em&gt;salt&lt;/em&gt; per impedire gli attacchi precalcolati (le rainbow table) e il &lt;em&gt;costo regolabile&lt;/em&gt; per
restare al passo con l&#39;hardware che migliora. In breve: SHA-256 risponde alla domanda &#34;questi dati sono
integri?&#34; nel modo più efficiente possibile; le password pongono la domanda opposta, &#34;quanto posso
rendere costoso indovinare?&#34;, e lì la risposta giusta è un algoritmo progettato per essere lento e avido
di memoria. Usare SHA-256 per le password non è un&#39;ottimizzazione, è usare lo strumento costruito per
l&#39;obiettivo sbagliato. Lo vedremo in dettaglio nel capitolo sul password hashing.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;Una funzione di hash crittografica dà un&amp;rsquo;impronta fissa con resistenza a preimmagine e collisioni
(ridotta a $2^{n/2}$ dal paradosso del compleanno) ed effetto valanga: usa SHA-256/SHA-3, mai MD5 o
SHA-1. Ma l&amp;rsquo;hash garantisce integrità, non &lt;em&gt;autenticità&lt;/em&gt;: non dice chi ha prodotto i dati. Per legarli
a un segreto condiviso serve aggiungere una chiave all&amp;rsquo;hash — è l&amp;rsquo;HMAC, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cifratura simmetrica e AEAD</title>
        <link>https://www.matteobianchi.eu/p/cifratura-simmetrica-e-aead/</link>
        <pubDate>Tue, 11 Aug 2026 09:00:00 +0200</pubDate>
        
        <guid>https://www.matteobianchi.eu/p/cifratura-simmetrica-e-aead/</guid>
        <description>&lt;img src="https://www.matteobianchi.eu/p/cifratura-simmetrica-e-aead/cover.png" alt="Featured image of post Cifratura simmetrica e AEAD" /&gt;&lt;h2 id=&#34;perché-conta&#34;&gt;Perché conta
&lt;/h2&gt;&lt;p&gt;La &lt;a class=&#34;link&#34; href=&#34;https://www.matteobianchi.eu/p/crittografia-applicata-la-serie/&#34; &gt;serie&lt;/a&gt; parte dal mattone più usato: la
&lt;strong&gt;cifratura simmetrica&lt;/strong&gt;, dove la stessa chiave cifra e decifra. È veloce e protegge quasi tutti i
dati a riposo e in transito. Ma &amp;ldquo;uso AES&amp;rdquo; è una frase incompleta e spesso pericolosa: AES è un
&lt;em&gt;cifrario a blocchi&lt;/em&gt;, e come lo si applica — la &lt;strong&gt;modalità operativa&lt;/strong&gt; — decide se il sistema è sicuro
o completamente rotto.&lt;/p&gt;
&lt;h2 id=&#34;il-problema-delle-modalità-ecb&#34;&gt;Il problema delle modalità: ECB
&lt;/h2&gt;&lt;p&gt;AES cifra blocchi da 16 byte. Un messaggio è più lungo: come si incatenano i blocchi? La modalità più
ingenua, &lt;strong&gt;ECB&lt;/strong&gt;, cifra ogni blocco in modo indipendente. Risultato disastroso: blocchi di testo in
chiaro identici producono blocchi cifrati identici.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Testo in chiaro con pattern ripetuti (es. un&amp;#39;immagine, dati strutturati)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ECB  → gli stessi blocchi → gli stessi cifrati → il pattern TRASPARE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  (il famoso &amp;#34;pinguino ECB&amp;#34;: cifri l&amp;#39;immagine e la vedi ancora)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ ECB non nasconde la struttura. NON usare MAI ECB.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;La lezione generale: la riservatezza non dipende solo dal cifrario, ma da come lo usi. Serve che testi
identici producano cifrati &lt;em&gt;diversi&lt;/em&gt; — ottenuto introducendo un valore variabile per ogni cifratura.&lt;/p&gt;
&lt;h2 id=&#34;nonce-e-iv-il-valore-che-cambia-tutto&#34;&gt;Nonce e IV: il valore che cambia tutto
&lt;/h2&gt;&lt;p&gt;Le modalità sicure usano un &lt;strong&gt;nonce&lt;/strong&gt; (o IV, initialization vector): un valore che rende ogni
cifratura unica anche con la stessa chiave e lo stesso testo. La regola ferrea:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un nonce non si riusa &lt;strong&gt;mai&lt;/strong&gt; con la stessa chiave.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Riusare un nonce rompe la sicurezza in modi gravi e specifici per modalità — in GCM, come vedremo, è
catastrofico. Il nonce non è segreto (viaggia in chiaro col messaggio), ma deve essere &lt;em&gt;unico&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;aead-cifrare-e-autenticare-insieme&#34;&gt;AEAD: cifrare e autenticare insieme
&lt;/h2&gt;&lt;p&gt;Ecco l&amp;rsquo;errore storico più comune: cifrare &lt;em&gt;senza&lt;/em&gt; autenticare. Un cifrato non autenticato può essere
&lt;strong&gt;modificato&lt;/strong&gt; da un attaccante senza che te ne accorga — ribaltare bit, troncare, riordinare. La
riservatezza non implica l&amp;rsquo;integrità. La soluzione moderna è &lt;strong&gt;AEAD&lt;/strong&gt; (Authenticated Encryption with
Associated Data): cifra &lt;em&gt;e&lt;/em&gt; autentica in un&amp;rsquo;unica operazione.&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    PT[Testo in chiaro] --&amp;gt; E[AEAD&amp;lt;br/&amp;gt;es. AES-GCM]
    K[Chiave] --&amp;gt; E
    N[Nonce unico] --&amp;gt; E
    AD[&amp;#34;Associated data&amp;lt;br/&amp;gt;(header, in chiaro&amp;lt;br/&amp;gt;ma autenticato)&amp;#34;] --&amp;gt; E
    E --&amp;gt; CT[Cifrato]
    E --&amp;gt; TAG[Tag di autenticazione]
    style E fill:#fde2e4,stroke:#e63946
&lt;/pre&gt;

&lt;p&gt;Il &lt;strong&gt;tag&lt;/strong&gt; garantisce che il cifrato (e gli &lt;em&gt;associated data&lt;/em&gt;, dati che viaggiano in chiaro ma vanno
protetti da manomissione, come un header) non siano stati alterati. In decifratura, se il tag non
combacia, l&amp;rsquo;operazione &lt;em&gt;fallisce&lt;/em&gt; invece di restituire dati manomessi. Cifratura e integrità in un
colpo solo, senza doverle combinare a mano (dove si sbaglia).&lt;/p&gt;
&lt;h2 id=&#34;la-risposta-giusta-oggi&#34;&gt;La risposta giusta oggi
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;hl&#34;&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Devo cifrare dei dati simmetricamente. Cosa uso?
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  AES-GCM                → se hai accelerazione hardware AES (quasi tutti i server/CPU moderni)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line hl&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ChaCha20-Poly1305      → se non ce l&amp;#39;hai (mobile, embedded): veloce in software, nessun timing leak
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  entrambi sono AEAD: cifratura + autenticazione. Nonce unico per ogni messaggio.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ NON: ECB (rotto), CBC senza MAC (manipolabile), roll-your-own.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GCM e ChaCha20-Poly1305 sono le due scelte di default. Entrambe AEAD, entrambe standard, entrambe con
lo stesso vincolo non negoziabile: &lt;strong&gt;nonce unico&lt;/strong&gt;.&lt;/p&gt;


&lt;details&gt;
&lt;summary&gt;&lt;strong&gt;Domanda:&lt;/strong&gt; perché riusare un nonce in AES-GCM è &#34;catastrofico&#34; e non solo una debolezza minore come in altre modalità?&lt;/summary&gt;
&lt;p&gt;Perché in GCM il riuso del nonce non degrada la sicurezza gradualmente, la demolisce su due fronti in
una volta sola. Primo, la riservatezza, ed è il meccanismo comune a tutte le cifrature a flusso: GCM
genera un keystream a partire da chiave e nonce, e cifra facendo lo XOR del testo con quel keystream. Se
usi lo stesso nonce con la stessa chiave per due messaggi, generi lo &lt;em&gt;stesso&lt;/em&gt; keystream per
entrambi; facendo lo XOR dei due cifrati il keystream si cancella e ottieni lo XOR dei due testi in
chiaro, da cui, con un po&#39; di analisi, si recuperano i messaggi. Fin qui è il classico disastro del
&#34;two-time pad&#34;, condiviso con CTR e con ogni cifrario a flusso. Ma GCM aggiunge un secondo crollo, suo
specifico e più grave: l&#39;&lt;em&gt;autenticazione&lt;/em&gt;. Il tag di GCM è calcolato con una funzione (GHASH) che
usa una chiave di autenticazione derivata, e due tag prodotti sotto lo stesso nonce danno all&#39;attaccante
abbastanza informazioni per recuperare quella chiave di autenticazione segreta. Una volta che ce l&#39;ha,
non può più solo leggere: può &lt;em&gt;forgiare&lt;/em&gt; tag validi per messaggi arbitrari di sua scelta, cioè
l&#39;intera garanzia di integrità di GCM svanisce, non per i due messaggi incriminati ma in generale per
quella chiave. È la differenza che rende il riuso del nonce in GCM una categoria a sé: in CBC un IV
prevedibile o riusato indebolisce la riservatezza in modi fastidiosi ma circoscritti; in GCM perdi
riservatezza &lt;em&gt;e&lt;/em&gt; la capacità di autenticare, e quest&#39;ultima in modo che compromette la chiave di
autenticazione per sempre. Ecco perché il vincolo &#34;nonce unico&#34; in GCM non è una buona pratica tra le
tante, è la condizione senza la quale la modalità non ha alcuna proprietà di sicurezza. Nei sistemi dove
garantire l&#39;unicità è difficile (molte istanze che cifrano in parallelo senza coordinarsi, rischio di
riavvii che azzerano un contatore) la pratica è generare il nonce in modo casuale con un margine ampio, o
usare varianti pensate apposta per resistere al riuso come AES-GCM-SIV, che degrada in modo molto più
clemente se l&#39;unicità viene a mancare.&lt;/p&gt;
&lt;/details&gt;


&lt;h2 id=&#34;conclusione&#34;&gt;Conclusione
&lt;/h2&gt;&lt;p&gt;La cifratura simmetrica protegge la riservatezza, ma la modalità operativa decide tutto: ECB è rotto,
cifrare senza autenticare è manipolabile, e la risposta moderna è AEAD (AES-GCM o
ChaCha20-Poly1305), con nonce unico come vincolo sacro. AEAD ci ha già dato un assaggio di
&lt;em&gt;integrità&lt;/em&gt; tramite il tag. Ma l&amp;rsquo;integrità ha un mattone proprio, più fondamentale e usato ovunque,
anche fuori dalla cifratura: le funzioni di hash, prossimo capitolo.&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
