La sicurezza su Internet è una questione che è stata così trascurata all’inizio, all’epoca in cui nasceva IPv4, quanto è invece oggetto di attenzione al giorno d’oggi. IPSec è stata, ed è ancora, un’eccellente soluzione per trasmettere dati in maniera sicura su Internet. Si tratta di un soggetto piuttosto ampio e non banale, soprattutto perché coinvolge una grande quantità di tecnologie diverse. Ne vediamo le basi.
Alice e Bob hanno qualcosa da dirsi.
Supponiamo che Alice e Bob (che sono ormai gli attori di tutti gli scenati di sicurezza informatica nel mondo) vogliano comunicare: supponiamo che lo facciano inviandosi reciprocamente delle lettere, e supponiamo che abitino in un villaggio in cui molte persone amano spiare gli altri (un po’ come è Internet).
Le necessità di Alice e Bob nell’inviarsi posta possono essere più ampie della semplice confidenzialità, e possono ad esempio coprire autenticazione, integrità, confidenzialità e non ripetibilità (o, usando i noti termini inglesi, authentication, integrity, confidentiality e anti replay).
Se il lettore sa già cosa questi temini indicano, può tranquillamente saltare al prossimo post, altrimenti è fortemente consigliato a procedere.
Cosa intendiamo con authentication, integrity, anti-replay, confidentiality,
Le necessità di sicurezza di Alice e Bob possono essere descritte nei termini che seguono:
Se Alice invia a Bob un messaggio che dice “Incontriamoci a vicolo stretto questa sera alle 8.00” Bob vuole essere sicuro che sia effettivamente Alice il mittente del messaggio, e non Chuck, che è famoso per i suoi scherzi maliziosi e un po’ perfidi. Questo à ciò che chiamiamo autenticazione del mittente, e richiede che Alice firmi il messaggio in qualche modo, provando così la sua identità.
Ad esempio, Alice potrebbe avere una chiave speciale che utilizza per firmare i propri messaggi. Questa chiave è nota solo ad Alice e Bob, che la custodiscono gelosamente.
Supponiamo che questa chiave sia “1234”. Con questo intendiamo dire che il messaggio sarà codificato in questo modo: il primo carattere è translato di un posto (a-> b), il secondo di due (a->c), il terzo di tre (a->d), il quarto carattere di quattro (a->e) e poi si ricomincia da uno.
Se Alice vuole aggiungere il propro nome alla fine del messaggio, la firma riporterà, invece di “alice”, “bnlgd” (ad “a” sostituiamo “b”, a “l” sosituiamo “n”, che segue “l” di due posti, a “i” sostituiamo “l” che segue i di tre posti, abbiamo usato per generalità l’alfabeto inglese, che dopo “i” introduce “jkl”).
Il messaggio dovrebbe avere una qualche forma di indicatore temporale (una data), o Chuck potrebbe copiare la firma da una lettera e metterla su un’altra. Perciò il messaggio di firma deve essere qualcosa del tipo “Con affetto, oggi, 1 aprile 2016, alle ore 9.00 del mattino, Alice”.
Questa è quella che viene definita una marca temporale (timestamp) e serve ad evitare che un messaggio venga utilizzato più volte (antireplay).
Bob è in possesso della chiave per decifrare il messaggio, è in grado di leggerlo e verificare da chi sia stato inviato e quando. Supponiamo per il momento che il messaggio di per sé viaggi comunque in chiaro, seguito da una serie di dati (firma ed antireplay), che possono essere aggiunti in coda al messaggio stesso. Potrebbe sembrare più semplice crittografare l’intero corpo del testo (in alcuni casi lo è davvero), ma per ragioni che saranno chiare in seguito, supponiamo che Alice, magari per pigrizia, per ora non abbia intenzione di farlo.
Dato che il messaggio è in chiaro, Bob potrebbe sospettare che il testo, per quanto effettivamente inviato da Alice in quella data, sia stato modificato. Ad esempio il messaggio originale avrebbe potuto essere “incontriamoci alle 9.00” e non alle 8.00, ma sia stato cambiato lungo la strada.
Per garantirne l’integrità, dobbiamo effettuare una qualche funzione sul corpo dell’intero messaggio che ci assicuri che questo non sia stato modificato. A questo scopo Alice calcola un hash del testo, vale a dire esegue una certa quantità di operazioni matematiche che producono un singolo risultato numerico (diciamo 17734). Gli algoritmi generalmente usati a questo scopo sono ad esempio MD5 e SHA-1. La caratteristica dei processi di hashing è che il cambiamento, anche di un solo carattere, all’interno del testo elaborato portano ad un codice di hash completamente diverso dall’originario.
Il messaggio che Alice sta inviando a Bob ha perciò una struttura di questo tipo:
"Testo del messaggio: Incontriamoci a vicolo stretto questa sera alle 8.00 Codice HASH che garantisce l'integrità del messaggio: 17734 Firma di alice con timestamp, crittografata: ************* Contenuto della parte crittografata: 1 aprile 2016, alle ore 9.00 del mattino, Alice"
Naturalmente Chuck potrebbe intercettare il messaggio, modificarlo, ricalcolare l’hash e sostituirlo nel messaggio stesso. Per evitare questo,Alice crittografa anche l’hash, con la stessa chiave che condivide con Bob. In questo modo Chuck non può né leggere l’hash, nè tantomeno modificarlo. Il testo diventa perciò questo:
"Testo del messaggio: Incontriamoci a vicolo stretto questa sera alle 8.00 Codice HASH che garantisce l'integrità del messaggio: ***** Contenuto dell'hash crittografato: 17734 Firma di alice con timestamp, crittografata: ************* Contenuto della parte crittografata: 1 aprile 2016, alle ore 9.00 del mattino, Alice"
In questo modo abbiamo ottenuto che anche l’integrità del messaggio sia garantita. Di questo messaggio possiamo dire che, fintanto che la chiave di Alice non viene compromessa, abbiamo certezza dell’autore, della data di invio, e del suo contenuto.
Il resto ad una prossima volta.