Il framework del protocollo Noise
Scopra Noise, un framework per costruire handshake crittografici personalizzati utilizzato in WireGuard, WhatsApp e Lightning.
Il framework del protocollo Noise è una lezione Cryptology Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cryptology Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cryptology Academy include 4 lezioni in totale.
Che cos'è il framework Noise
Il Noise Protocol Framework (Trevor Perrin, 2016; revisione attuale del 2018) è un framework per creare protocolli di canale sicuri utilizzando un piccolo insieme di primitive e un linguaggio basato su pattern. Invece di specificare un singolo protocollo, Noise definisce un vocabolario di pattern di handshake che descrivono la sequenza delle operazioni DH e il loro ordine. Qualsiasi pattern Noise valido può essere istanziato con funzioni concrete per DH (Curve25519 o Curve448), per la cifratura (AESGCM o ChaChaPoly) e per l'hashing (SHA-256, SHA-512, BLAKE2). Noise viene utilizzato in WireGuard, WhatsApp, Signal (come base di X3DH), Lightning Network e I2P.
Ruoli e chiavi di Noise
Ogni handshake Noise ha un initiator (I) e un responder (R). Ogni parte può avere due tipi di chiavi: statica (chiave d'identità a lungo termine, indicata con s/S) ed effimera (generata ex novo per ogni sessione, indicata con e/E). Le lettere minuscole indicano la chiave della parte locale; le maiuscole indicano la chiave pubblica della parte remota. Un pattern Noise specifica quali chiavi vengono inviate (in chiaro o cifrate) e quali operazioni DH vengono eseguite. Ad esempio, "e" significa "inviare la propria chiave pubblica effimera"; "es" significa "eseguire DH(my_ephemeral, remote_static)". Ogni risultato DH viene incorporato nello stato dell'hash in esecuzione dell'handshake.
Stato simmetrico di Noise
Il nucleo di Noise è SymmetricState, che mantiene tre valori: ck (chaining key, inizializzata con l'hash del nome del protocollo), h (handshake hash, l'hash della trascrizione calcolato progressivamente) e k (chiave di cifratura corrente). MixKey(input) esegue HKDF(ck, input) per aggiornare ck e k. MixHash(data) calcola l'hash di data e lo incorpora in h. EncryptAndHash(plaintext) cifra con k e incorpora il ciphertext in h. DecryptAndHash(ciphertext) decifra e incorpora il ciphertext in h. L'handshake hash h associa tutti i messaggi alla trascrizione: qualsiasi modifica avversaria a un messaggio cambia h e causa il fallimento della decifratura. Al termine dell'handshake, Split() produce due CipherState separati per l'invio e la ricezione.
Il pattern Noise_XX
Noise_XX è il pattern di autenticazione reciproca usato più comunemente. Fornisce l'autenticazione reciproca delle chiavi statiche, con le chiavi statiche di entrambe le parti trasmesse durante l'handshake. Pattern: (1) -> e (l'initiator invia la chiave pubblica effimera). (2) <- e, ee, s, es (il responder invia la chiave effimera, esegue DH(e,e) e DH(e,s_resp), quindi invia la chiave statica cifrata). (3) -> s, se (l'initiator invia la chiave statica cifrata ed esegue DH(s_init, e_resp)). Dopo il passaggio 3, entrambe le parti hanno incorporato tre risultati DH nella chiave di sessione: ee (forward secrecy), es (autenticazione del server), se (autenticazione del client). La chiave di sessione è indipendente dalla compromissione di qualsiasi chiave a lungo termine successiva alla fine della sessione.
Il pattern Noise_IK (WireGuard)
WireGuard usa un pattern derivato da Noise_IK in cui l'initiator conosce in anticipo la chiave statica del responder. (1) -> e, es, s, ss (l'initiator invia la chiave effimera, esegue DH(e, S_resp), invia la chiave statica cifrata ed esegue DH(s_init, S_resp)). (2) <- e, ee, se (il responder invia la chiave effimera, esegue DH(e_resp, e_init) e DH(e_resp, S_init)). Il pattern IK offre l'occultamento dell'identità dell'initiator (la sua chiave statica è cifrata con la chiave statica del responder nel passaggio 1) e il completamento in un solo RTT. WireGuard aggiunge un timestamp all'interno del payload cifrato dell'initiator per impedire i replay. Questo conferisce a WireGuard la sua caratteristica semplicità: un handshake VPN completo in due pacchetti UDP.
Handshake hash e channel binding di Noise
L'handshake hash h al termine di un handshake Noise è un hash della trascrizione che copre ogni messaggio inviato. Funge da valore di channel binding: entrambe le parti calcolano lo stesso h e qualsiasi protocollo di terze parti che desideri associarsi alla sessione Noise può includere h come nonce o ID del canale. Ciò consente l'autenticazione combinata: dopo l'handshake Noise può essere eseguito un passaggio di autenticazione con certificato in stile TLS, associando il certificato a questa specifica sessione tramite h. Il channel binding impedisce gli attacchi di inoltro delle credenziali, in cui credenziali di autenticazione provenienti da una sessione vengono riutilizzate contro un'altra. Split() fornisce h all'applicazione insieme alle chiavi di sessione.
Pattern differiti e fallback di Noise
Noise supporta pattern differiti per i casi in cui l'initiator non conosca in anticipo la chiave statica del responder. Noise_NX (l'initiator non ha una chiave statica; il responder trasmette la propria) è analogo a TLS unidirezionale. Noise_XX gestisce il caso in cui entrambe le parti debbano scambiarsi le chiavi. Noise_IK può ricorrere a Noise_XXfallback se l'ipotesi dell'initiator sulla chiave statica del responder è errata (ad esempio dopo una rotazione della chiave). Il pattern di fallback consente al responder di segnalare "è stata usata la chiave sbagliata; questa è la mia nuova chiave pubblica" senza rivelare agli osservatori esterni che è avvenuto il fallback, mantenendo così l'opacità del protocollo.
Noise in WhatsApp e Signal
WhatsApp e Signal usano Noise_XX per stabilire canali sicuri tra client e server. Il protocollo binario di WhatsApp usa Noise_XX con Curve25519, ChaChaPoly e SHA-256. La chiave statica del client è la sua chiave d'identità a lungo termine. Dopo l'handshake Noise, il livello applicativo esegue un'autenticazione aggiuntiva (registrazione a Signal, verifica del numero di telefono). X3DH (Extended Triple Diffie-Hellman) di Signal esegue quattro operazioni DH per stabilire un segreto condiviso tra due utenti tramite uno scambio asincrono di messaggi: non si tratta di un pattern Noise standard, ma usa concetti simili di incorporazione dei risultati DH. In seguito subentra Double Ratchet per la cifratura continuativa dei messaggi.
Noise e TLS
Noise e TLS 1.3 affrontano lo stesso problema (scambio autenticato di chiavi) secondo filosofie diverse. TLS 1.3 è un singolo protocollo con suite di cifratura, formati di certificato (X.509) ed estensioni prestabiliti. È progettato per browser web e server: un protocollo adatto alla maggior parte dei casi. Noise è un framework: non specifica alcun formato di certificato, PKI o associazione al trasporto. Questo rende Noise più compatto (l'intera implementazione Noise di WireGuard occupa meno di 400 righe di codice) e più facile da analizzare formalmente, ma richiede che l'applicazione gestisca separatamente la gestione delle identità. Noise è preferito per i sistemi chiusi (app-to-server, VPN), in cui la PKI sarebbe eccessiva; TLS è preferito per i sistemi aperti (web), in cui è necessaria l'interoperabilità dei certificati.
Sicurezza formale di Noise
I pattern Noise sono stati analizzati formalmente nel modello di sicurezza eCK (extended Canetti-Krawczyk). Kobeissi, Bhargavan e Blanchet hanno analizzato Noise usando Proverif e hanno ottenuto dimostrazioni di autenticazione e riservatezza delle chiavi per tutti i 12 pattern fondamentali di Noise. Le dimostrazioni presuppongono l'assunzione standard della difficoltà di DH (Curve25519) e la sicurezza delle funzioni AEAD e di hash sottostanti. La natura composizionale di Noise (ogni DH viene incorporato progressivamente) ne facilita l'analisi rispetto a protocolli complessi simili a TLS, con numerose transizioni di stato. La verifica crittografica di Noise ha dato a WireGuard e WhatsApp un'elevata fiducia nella sicurezza dei loro protocolli prima della distribuzione.
Implementare correttamente Noise
Problemi comuni nelle implementazioni di Noise: (1) Confusione tra pattern: usare Noise_IK quando la chiave statica del responder non è stata distribuita in modo affidabile in anticipo causa una mancata corrispondenza dell'identità (l'initiator potrebbe cifrare silenziosamente verso una chiave errata). (2) Protezione dai replay: Noise fornisce autenticazione, ma non protegge dai replay dei messaggi della fase di trasporto; è necessario far rispettare i nonce (contatore a 64 bit) e il wrap-around (dopo 2^64 messaggi) deve attivare una nuova derivazione delle chiavi. (3) Integrità del prologo: il prologo Noise (una stringa di byte incorporata in h prima dell'inizio dell'handshake) deve includere tutto il contesto del protocollo (versione, scelte degli algoritmi) per impedire gli attacchi di downgrade. (4) Uso improprio delle PSK: Noise supporta estensioni PSK per incorporare chiavi precondivise; le PSK devono avere elevata entropia e non essere password utente.
Quiz sul framework Noise
Che cosa significa la notazione di pattern Noise "es" in un handshake?
Riepilogo del framework Noise
Noise è un framework per costruire protocolli di scambio autenticato di chiavi usando un linguaggio di pattern basato su operazioni DH. SymmetricState mantiene la chaining key (ck), l'hash della trascrizione (h) e la chiave di cifratura (k), aggiornati da MixKey/MixHash. Noise_XX fornisce autenticazione reciproca in 1,5 RTT; Noise_IK (WireGuard) si completa in 1 RTT quando la chiave del responder è nota. L'handshake hash h funge da channel binding. Noise è stato verificato formalmente per tutti i pattern fondamentali tramite Proverif. È preferito a TLS per i protocolli a sistema chiuso (WireGuard, WhatsApp), in cui la PKI non è necessaria. Un'implementazione corretta richiede protezione dai replay, integrità del prologo e PSK con elevata entropia.
Domande Frequenti
La lezione «Il framework del protocollo Noise» è gratuita?
Sì — il testo completo di «Il framework del protocollo Noise» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cryptology Academy, passa a CoddyKit PRO. Il corso Cryptology Academy include 4 lezioni in totale.
Cosa imparerò in «Il framework del protocollo Noise»?
Scopra Noise, un framework per costruire handshake crittografici personalizzati utilizzato in WireGuard, WhatsApp e Lightning. Eserciti Cryptology Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Cryptology Academy?
Non è richiesta alcuna esperienza precedente. Cryptology Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Il framework del protocollo Noise»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Cryptology Academy?
Sì. Ogni lezione Cryptology Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il protocollo Needham-Schroeder e gli attacchi
- Protocollo Station-to-Station (STS)
- Il framework del protocollo Noise
- Principi di progettazione dei protocolli sicuri