Questo sito utilizza cookie per raccogliere dati statistici.
Privacy Policy
# Crittografia End to End
## Perché la crittografia end-to-end è fondamentale in alcuni contesti
La crittografia end-to-end (**E2EE**) è stata introdotta per risolvere una vulnerabilità intrinseca dei sistemi di messaggistica tra più utenti. In un’architettura **client-server-client**, dove il server funge da intermediario tra due utenti, il rischio maggiore è rappresentato dal fatto che i dati possono trovarsi in chiaro durante il loro trattamento sul server.
---
### Come funziona un sistema di messaggistica senza crittografia end-to-end
In un servizio di messaggistica che **non implementa E2EE**, i dati seguono questi passaggi:
1. **Cifratura durante il trasferimento (HTTPS)**:
Quando un utente (ad esempio Alice) invia un messaggio, questo viene cifrato dal client (dispositivo di Alice) durante la trasmissione al server utilizzando HTTPS. In questo modo, il contenuto del messaggio è protetto da intercettazioni lungo la rete.
2. **Decifratura sul server**:
Una volta che il messaggio arriva al server, viene **decifrato** per essere elaborato. In questa fase, il contenuto è completamente visibile in chiaro. Questo avviene per diversi motivi:
- Il server potrebbe analizzare il contenuto per fornire servizi aggiuntivi, come filtri anti-spam o suggerimenti.
- Il messaggio potrebbe essere archiviato temporaneamente in chiaro in attesa di essere consegnato al destinatario (ad esempio, se il destinatario è offline).
3. **Nuova cifratura per la trasmissione al destinatario**:
Quando il messaggio viene inoltrato al destinatario (ad esempio Bob), il server lo cifra nuovamente utilizzando HTTPS per proteggere la trasmissione fino al dispositivo di Bob.
### Dove si trovano le vulnerabilità
In questo modello, ci sono momenti in cui i dati sono vulnerabili:
1. **Sul server**:
Quando il messaggio viene decifrato sul server, il contenuto è visibile in chiaro. Questo crea rischi:
- **Accesso da parte dei proprietari del server**: I gestori del servizio potrebbero teoricamente accedere al contenuto per analisi o altre finalità, legittime o meno.
- **Attacchi esterni**: Se un attaccante compromette il server, potrebbe accedere ai messaggi archiviati in chiaro.
2. **Archiviazione temporanea**:
Anche se il messaggio è cifrato durante la trasmissione, potrebbe essere archiviato in chiaro sul server in attesa di essere inviato, rendendolo vulnerabile.
3. **Soggetti intermediari**:
In alcuni casi, il server potrebbe condividere i dati con altre entità (partner commerciali, agenzie di sorveglianza), compromettendo la privacy degli utenti.
### La necessità della crittografia end-to-end
Per risolvere questi problemi, è necessario un sistema in cui il server non possa **accedere ai dati**. La crittografia end-to-end nasce con questo obiettivo: garantire che i messaggi siano cifrati dal momento in cui lasciano il dispositivo del mittente fino a quando raggiungono il dispositivo del destinatario, senza mai essere decifrati durante il transito sul server.
### Come la crittografia end-to-end elimina le vulnerabilità
Con E2EE, il server diventa un mero intermediario incapace di accedere al contenuto dei messaggi. Ecco come cambia il processo:
1. **Cifratura sul dispositivo del mittente**:
Il messaggio viene cifrato direttamente sul dispositivo di Alice utilizzando una chiave generata tramite un sistema sicuro (ad esempio, combinando le chiavi pubbliche di Alice e Bob). Il messaggio cifrato viene inviato al server.
2. **Transito cifrato**:
Anche se il messaggio passa attraverso il server, il suo contenuto rimane cifrato. Il server può solo inoltrare il messaggio cifrato al destinatario, senza poterne leggere il contenuto.
3. **Decifratura sul dispositivo del destinatario**:
Solo il dispositivo di Bob, che possiede la chiave privata corrispondente, può decifrare il messaggio e leggerne il contenuto.
### Vantaggi dell’end-to-end rispetto al modello tradizionale
1. **Privacy completa**:
Nessuno, nemmeno il gestore del servizio o un attaccante che compromette il server, può accedere ai dati. Questo garantisce la riservatezza delle comunicazioni anche contro sorveglianza governativa o aziendale.
2. **Maggior sicurezza**:
Anche in caso di compromissione del server, i messaggi restano protetti, poiché il loro contenuto è cifrato e le chiavi private non sono mai archiviate sul server.
3. **Riduzione del rischio di abuso interno**:
I proprietari del servizio non hanno accesso ai dati degli utenti, eliminando il rischio di utilizzo improprio o analisi non autorizzate.
---
## Come viene implementata?
L’E2EE si basa su una combinazione di **crittografia asimmetrica** e **simmetrica**, ma con una differenza fondamentale: **i dati restano cifrati lungo tutto il percorso**, anche sui server intermediari.
#### 1. Scambio delle chiavi pubbliche
**Cosa succede**:
Quando due utenti vogliono comunicare, i loro dispositivi generano una coppia di chiavi asimmetriche (pubblica e privata). Le chiavi pubbliche vengono scambiate tra i dispositivi tramite un server, mentre le chiavi private restano segrete sui dispositivi.
**Perché si fa**:
- Lo scambio di chiavi pubbliche consente a ogni dispositivo di iniziare a cifrare i messaggi per il destinatario, utilizzando una chiave che solo quel destinatario può decifrare.
- Il server non può leggere le chiavi private, quindi non può accedere ai dati cifrati.
**Cosa si risolve**:
- Garantisce che solo il destinatario designato possa decifrare i messaggi, eliminando il rischio di accesso non autorizzato da parte del server.
---
#### 2. Generazione della chiave di sessione
**Cosa succede**:
I dispositivi dei due utenti utilizzano le chiavi pubbliche ricevute e le proprie chiavi private per generare una **chiave di sessione simmetrica unica**, utilizzata per cifrare e decifrare i messaggi.
**Perché si fa**:
- La chiave di sessione simmetrica consente una crittografia veloce e sicura per i messaggi successivi.
- La crittografia asimmetrica viene usata solo per lo scambio della chiave di sessione, poiché è più lenta rispetto alla simmetrica.
**Cosa si risolve**:
- La chiave di sessione non viene mai trasmessa direttamente, ma è derivata matematicamente dai dispositivi. Questo impedisce a un attaccante di intercettarla.
---
#### 3. Cifratura e invio dei messaggi
**Cosa succede**:
Ogni messaggio viene cifrato utilizzando la chiave di sessione. Anche se i messaggi transitano attraverso un server, il loro contenuto rimane cifrato.
**Perché si fa**:
- I dati restano protetti anche se un server viene compromesso.
- Il provider del servizio (ad esempio, WhatsApp o Signal) non può accedere ai contenuti, garantendo la privacy dell’utente.
**Cosa si risolve**:
- I server diventano solo trasportatori di dati cifrati, senza alcuna capacità di leggerne il contenuto.
---
#### 4. Decifratura dei messaggi
**Cosa succede**:
Il dispositivo del destinatario utilizza la chiave di sessione per decifrare il messaggio ricevuto e leggerne il contenuto.
**Perché si fa**:
- Solo il dispositivo destinatario possiede la chiave corretta per decifrare il messaggio, garantendo che la comunicazione rimanga privata.
**Cosa si risolve**:
- Anche se un attaccante intercettasse il messaggio cifrato, non potrebbe decifrarlo senza la chiave.
---
### Esempio pratico: un messaggio in una chat crittografata
1. **Problema**: Due utenti vogliono comunicare senza che il provider del servizio possa leggere i loro messaggi.
2. **Soluzione con E2EE**:
- I dispositivi scambiano le chiavi pubbliche tramite il server.
- Generano una chiave di sessione condivisa per cifrare i messaggi. In questa fase i dispositivi cominicano tra loro cifrando le informazioni con la chiave pubblica del loro interessato. Questi messaggi quindi non potranno essere interpretati dal server che fa da tramite.
- Una volta creata questa chiave simmetrica conosciuta da entrambi i dispositivi terminali la comunicazione avverrà utilizzando questa come chiave crittografica e anche decrittografica.
<div class="e2ee-container">
<div class="e2ee-content">
<div class="e2ee-box">
<p class="agent">Alice</p>
<p class="plaintext">"Ciao Bob, come stai?"</p>
<p class="step">Cifratura E2EE con chiave $ K $:</p>
<p class="encrypted">"m12345XyZ"</p>
<p class="step">Cifratura HTTPS:</p>
<p class="https-encrypted-alice">"hjds7534n"</p>
</div>
<div class="e2ee-arrow">➡</div>
<div class="e2ee-box">
<p class="agent">Server</p>
<p class="https-encrypted-alice">"hjds7534n"</p>
<p class="step">Il decifra il messaggio da HTTPS:</p>
<p class="encrypted">"m12345XyZ"</p>
<p class="step">Il server cifra nuovamente il messaggio in HTTPS:</p>
<p class="https-encrypted-bob">"lks8765s2f3"</p>
</div>
<div class="e2ee-arrow">➡</div>
<div class="e2ee-box">
<p class="agent">Bob</p>
<p class="https-encrypted-bob">"lks8765s2f3"</p>
<p class="step">Il decifra il messaggio da HTTPS:</p>
<p class="encrypted">"m12345XyZ"</p>
<p class="step">Decifratura E2EE con chiave $ K $:</p>
<p class="plaintext">"Ciao Bob, come stai?"</p>
</div>
</div>
</div>
<style>
.e2ee-container {
font-family: Arial, sans-serif;
border: 2px solid #ccc;
border-radius: 8px;
padding: 20px;
box-sizing: border-box;
width: 100%;
margin: auto;
background-color: #f9f9f9;
}
.e2ee-content {
display: flex;
align-items: center;
justify-content: space-around;
flex-wrap: wrap;
gap: 15px;
}
.e2ee-box {
border: 2px solid #007bff;
border-radius: 8px;
padding: 15px;
flex: 1 1 calc(33% - 30px); /* Adatta il contenuto al contenitore */
min-width: 200px;
max-width: 250px;
text-align: center;
background-color: #fff;
}
.e2ee-arrow {
font-size: 24px;
color: #555;
flex: 0 0 50px;
text-align: center;
}
.agent {
font-weight: bold;
margin-bottom: 10px;
color: #007bff;
}
.plaintext {
color: green;
font-weight: bold;
margin-bottom: 10px;
}
.encrypted {
color: red;
font-weight: bold;
margin-bottom: 10px;
}
.https-encrypted-alice, .https-encrypted-bob {
color: blue;
font-weight: bold;
margin-bottom: 10px;
}
.https-encrypted-bob {
color: darkmagenta;
font-weight: bold;
margin-bottom: 10px;
}
.step {
color: #333;
font-size: 14px;
margin-bottom: 10px;
font-style: italic;
}
@media (max-width: 600px) {
.e2ee-content {
flex-direction: column;
}
.e2ee-arrow {
transform: rotate(90deg);
}
}
</style>