Che cos’è e a cosa serve l’Handshake nel protocollo SSL/TLS

Che cos’è e a cosa serve l’Handshake nel protocollo SSL/TLS

Il protocollo SSL/TLS

Il protocollo SSL/TLS si colloca al quinto livello (Session layer) della pila protocollare ISO/OSI, è studiato appositamente per fornire un canale di comunicazione bidirezionale client/server criptato e offre funzionalità di autenticazione del server mediante certificato digitale firmato elettronicamente, si pone un gradino superiore al livello di trasporto TCP, sul quale viene incapsulato per l’instradamento e si pone come intermediario tra per l’appunto il livello di trasporto e quello di applicazione (ad esempio HTTP). Fornisce uno strumento che permette di ovviare o comunque mitigare il furto di dati mediante packet sniffing criptando il traffico e di attacchi di tipo spoofing (camuffamento) garantendo un sistema di autenticazione gerarchizzato, composto dai vari Certificate Authorities, enti certificatori che rilasciano per l’appunto certificati digitali confermando l’identità degli enti che richiedono un certificato di autenticazione, il tutto in maniera gerarchicamente ricorsiva con uno schema ad albero/piramide (io Root certificate certifico te, ente certificatore di primo livello, chi verrà certificato da te potrà svolgere il ruolo di certificatore di secondo livello ecc.).

Handshake, Cipher suite list, Tunneled stream

Come appena detto il protocollo ha lo scopo di fornire un canale di comunicazione bidirezionale criptato, caratteristica che si rende necessaria per garantire la sicurezza dello scambio di dati in transazioni sensibili passanti per la rete Internet (acquisto online con carta di credito…) la quale non è assolutamente presente nel layer sottostante della pila (TCP si preoccupa dell’affidabilità della connessione, garantendo il servizio di invio e ricezione confermati dei pacchetti, non della sicurezza) e che non è sempre presente a livello di applicazione a causa della grande etereogeneità dei servizi che i protocolli offrono a quel livello.

L’handshake tra client e server rappresenta l’unica parte dell’interazione TLS tra i due host a viaggiare in chiaro: il client instrada un pacchetto denominato “Hello Client” con il quale si presenta al Server inviandogli le informazioni necessarie per la creazione del tunnel di comunicazione. Di grande interesse come aspetto trattato nel seguito di questa ricerca, all’interno del pacchetto Hello Client è presente la lista dei Cipher supportati dall’applicazione in uso da quest’ultimo (ad esempio Browser Agent), ogni Cipher (Cifrario) rappresenta una combinazione di: tipologia di algoritmo di crittografia (autenticazione unilaterale, asimmetrica mediante scambio di chiavi pubbliche ecc.), tipologia delle chiavi di cifratura e consequenzialmente dell’algoritmo utilizzato per criptare il data stream ed il MAC algorythm (Message Authentication Code) il quale determina la lunghezza e il tipo di algoritmo utilizzati per creare il digest hash utilizzato poi dal relativo host ricevitore del pacchetto per verificarne l’integrità e l’assenza di manipolazione da parte di un attaccante esterno. Il messaggio di risposta e di presentazione del server, denominato appunto “Hello Server” contiene due parametri fondamentali per la buona riuscita dell’handshake, il Cipher preferito supportato dal server in base alla lista di Ciphers fornita nell’Hello Client ed il certificato di autenticazione del server, con il quale quest’ultimo fornisce la propria identità digitale al client per l’autenticazione. Eventuali ulteriori pacchetti possono essere scambiati tra client e server nel caso ci sia la necessità o la scelta arbitraria da parte di uno dei due di cambiare Cipher per l’encryption del canale di comunicazione, questo espediente viene per l’appunto utilizzato come metodo per rinegoziare le chiavi senza dover reinizializzare l’handshake.
Una volta designato ed accettato il Cipher da entrambe le parti chiamate in causa, lo scambio di dati vero e proprio può avvenire (ad esempio richiesta di risorsa web mediante protocollo HTTPS).

Che cos'è e a cosa serve l'Handshake nel protocollo SSL-TLS

 

Stream Cipher e Block Cipher

Degna di nota è la differenza sul come agiscono le due tipologie di Cipher che possono essere utilizzate per crittografare il tunnel TLS, gli stream Cipher ed i Block Cipher, confronto necessario in quanto alcuni tentativi di exploit del protocollo sfruttano o hanno comportamenti differenti in funzione di un tipo di Cipher o dell’altro.
Gli stream Cipher sono chiavi di cifratura simmetrica nelle quali la parte di dato in chiaro viene combinata con una chiave di cifratura pseudorandom (keystream), dove ogni byte del flusso viene crittografato con il relativo byte del keystream (ad esempio: keystream di 10 bytes, flusso di 100 bytes, i bytes 1,11,21… verranno crittografati con il primo byte del keystream, i bytes 2,12,22… con il secondo byte del keystream ecc.), la crittografia avviene tramite semplici operazioni logiche booleane (generalmente XOR). Il valore del keystream viene ottenuto mediante l’uso di un numero variabile di operazioni di SHIFT L o SHIFT R sui registri della CPU. Il carico computazionale associato per l’esecuzione di algoritmi che si basano su stream cipher è piuttosto basso, in quanto il numero ed il tipo di operazioni che vengono effettuato è alquanto semplice, soprattutto se paragonato con quello dei Block Ciphers.

La crittografia usata dai Block Ciphers si differenzia da quella degli Stream in quanto nel secondo caso la chiave generata di k bytes opera indipendentemente da quella che è la lunghezza dello stream (essendo appunto uno stream, la dimensione del flusso di dati da crittografare non è deducibile a priori) e generalmente parti dello stream in cui un dato viene ripetuto il risultato dopo il termine dell’algoritmo su quelle porzioni di flusso generalmente varia in quanto la posizione del dato all’interno dello stream influisce su quale parte del keystream viene utilizzata per oscurare quella porzione di stream. Nei Block Cipher, come il nome suggerisce, l’offuscamento avviene per blocchi, quindi nel caso la stessa porzione di bytes da crittografare sia contenuta più volte all’interno di uno stesso blocco, ogni istanza di quella porzione criptata risultante risulterà comunque uguale all’interno di quel blocco.

I block Cipher sono chiavi di cifratura di k bytes che operano su blocchi di dati di lunghezza di n bytes dove k ed n sono dei numeri fissi dipendenti dalla tipologia di Block Cipher utilizzato. Gli algoritmi usati per i block cipher prevedono inizialmente la divisione logica del flusso per l’appunto in blocchi, i quali possono essere codificati sempre con la medesima chiave oppure con un vettore circolare (initialization vector) nel quale vengono inserite le chiavi che si susseguiranno nella codifica di ogni blocco. Utilizzando blocchi di dimensione fissa spesso si rende necessario aggiungere una componente di padding al dato da cifrare, in modo da raggiungere la dimensione fissata del blocco, aspetto che per alcuni block ciphers è risultato cruciale nello sfruttamento delle vulnerabilità di quest’ultimi.

Flusso differenziato del processo di crittografia di Stream Cipher e di Block Cipher
Flusso differenziato del processo di crittografia di Stream Cipher e di Block Cipher

 

Pubblicato da Vito Lavecchia

Lavecchia Vito Ingegnere Informatico (Politecnico di Bari) Email: [email protected] Sito Web: https://vitolavecchia.altervista.org

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *