Autenticazione e firma elettronica

In questa argomentazione vedremo come è possibile garantire l'autenticità di un messaggio.

Un messaggio cifrato non è necessariamente autentico
Come si può garantire l'autenticità di un messaggio?

Ci sono essenzialmente due modi:

  • l'autenticazione simmetrica
  • la firma elettronica

L'idea di base è autenticare un messaggio sfruttando un codice di autenticazione. Nell'autenticazione simmetrica questo avviene attraverso l'uso di cifrari simmetrici come DES
o AES. Mentre nella firma elettronica avviene attraverso cifrari asimmetrici come RSA. Vediamo prima come potrebbero essere sfruttati i cifrari che conosciamo per l'autenticazione.

Autenticazione mediante chiave simmetrica
...

Consideriamo il caso in cui due utenti condividono una chiave simmetrica che consenta loro di cifrare/decifrare i messaggi scambiati.

Immaginiamo un messaggio , inviato da verso , dove i due estremi condividono una chiave segreta . Se nessun altro conosce la chiave, il messaggio è irrecuperabile da terzi.

Pasted image 20230903120522.png

Inoltre, è sicuro che il messaggio è stato generato da . Il motivo è che dato che è l'unico a possedere la chiave, è l'unico ad essere in grado di cifrare un messaggio, se recupera correttamente il messaggio , è in grado di dire che il messaggio iniziale non è stato alterato, un attaccante per poter alterare il messaggio cifrato , in modo che venga poi recuperato correttamente da dovrebbe conoscere , ma se oltre ad , non è nota a nessuno, questo non è possibile. Quindi la cifratura simmetrica fornisce autenticazione (verifica dell'origine del messaggio) tanto quanto confidenzialità (protezione del contenuto del messaggio).

Tuttavia dobbiamo approfondire un attimo la questione:
potrebbe ricevere da qualsiasi sequenza di bit, per poter dire che il messaggio è autentico, deve essere in grado di dire che il messaggio ricevuto ha senso. Tuttavia, un sistema per certificare l'autenticità di un messaggio dovrebbe essere automatizzato e non a discrezione dei giudizi di sul messaggio ottenuto dalla decifrazione. Un messaggio decifrato, per essere "sensato" ha un certo pattern (schema), tuttavia se il sistema accetta qualsiasi schema di messaggio decifrato (in bit, ovviamente) non vi è modo di distinguere messaggi autentici da quelli che non lo sono.

Una soluzione potrebbe essere quella di considerare autentico, solo un certo numero di pattern di bit. Se il numero di pattern accettati dal sistema è abbastanza alto, la probabilità di ottenere un messaggio non sensato sarebbe molto bassa.

Un'altra soluzione è quella di forzare il messaggio in chiaro ad avere una certa struttura facilmente riconoscibile, ma che non possa essere replicata senza ricorrere alla funzione di cifratura. Per esempio, si potrebbe aggiungere un error-detecting code, anche noto come frame check sequence (FCS), o ancora checksum, ad ogni messaggio prima che avvenga la cifratura. Ecco un esempio:

  • prepara il messaggio da inviare
  • passa il messaggio ad una funzione che ne produce il checksum
  • il checksum viene aggiunto al messaggio
  • l'intero blocco e il checksum vengono cifrati dalla funzione di cifratura

Quando riceve il messaggio lo decifra ottenendo un messaggio e un checksum, a questo punto usa il messaggio come input di , se ottiene il medesimo checksum allora il messaggio è autentico.

Ricordiamo che la funzione , deve fare uso anche dalla chiave che i due utenti condividono.

Autenticazione mediante chiave pubblica
...

L'uso della chiave pubblica fornisce confidenzialità, ma non autenticazione.
Infatti, la sorgente usa la chiave pubblica della destinazione per cifrare il messaggio che solamente il destinatario , usando la sua chiave privata potrà decifrare. Tuttavia, chiunque può utilizzare la chiave pubblica di per inviargli messaggi, quindi non è detto che il mittente sia .

Per fornire autenticazione, il mittente , dovrebbe cifrare il messaggio con la sua chiave privata (che solo lui possiede), il destinatario userà poi la chiave pubblica di per decifrare il messaggio, in questo caso è sicuro che è stato a comporre il messaggio decifrato. Anche in questa situazione si presenta il problema affrontato sopra, ovvero deve essere possibile distinguere bit casuali decifrati dal destinatario e bit sensati. Anche qui è necessario dare una certa struttura al messaggio come detto nel caso precedente.

Pasted image 20230903123318.png

Assumendo che esiste una struttura tale da poter autenticare correttamente il messaggio, allora la cifratura asimmetrica è in grado di fornire autenticazione. Oltre a questo, però, questo schema fornisce anche un'altra cosa, nota come firma digitale: solo può aver costruito il ciphertext ricevuto da , poiché solo lui possiede la . ha firmato il messaggio con la sua firma digitale.

Notiamo anche che questo schema non fornisce confidenzialità, poiché il messaggio cifrato con è decifrabile da chiunque abbiamo la chiave pubblica di .

Per ottenere sia confidenzialità, che autenticazione e firma digitale, può creare il suo messaggio, cifrarlo con la chiave pubblica di , cifrarlo con la sua chiave privata e inviarlo a .

Pasted image 20230903123813.png

Message Authentication Code ()
...

Un'alternativa tecnica di autenticazione coinvolge l'uso di una chiave segreta per generare un piccolo blocco di dati di dimensione fissa, tale blocco è noto come , o cryptographic checksum, tale codice è aggiunto al messaggio. Si presume, nell'utilizzo di tale tecnica, che le due parti comunicanti, diciamo e , condividano una chiave . Quando vuole inviare un messaggio a , allora egli calcola il come funzione della chiave e del messaggio:

  • è la funzione di
  • la chiave comune alle parti
  • il messaggio in plaintext
  • è il codice di dimensione fissa generato.

Il messaggio, con l'aggiunta del , viene inviato al destinatario. Questo effettua lo stesso calcolo sul messaggio ricevuto, utilizzando la stessa chiave, genera il . Il generato dal messaggio ricevuto, viene confrontato con quello che era stato aggiunto al messaggio inviato da . Se supponiamo che solo le parti comunicanti, conoscono e il confronto dei effettuato da risulta corretto, allora:

  1. Il destinatario è sicuro che il messaggio ricevuto non è stato alterato, poiché se il messaggio viene alterato nel corso della trasmissione verso , il generato da quest'ultimo non corrisponderebbe con quello allegato al messaggio.
  2. Il destinatario è sicuro che il messaggio arriva dal mittente , poiché un terzo, per alterare il messaggio, dovrebbe essere a conoscenza della chiave utilizzata per generare il , in modo da generare un nuovo per il messaggio alterato.

La funzione utilizzata per la generazione del è simile ad una operazione di cifratura, tuttavia c'è una differenza, la funzione di non ha bisogno di essere reversibile.

Il può essere ottenuto con:

tramite DES-CBC
...

Questa tecnica è stata largamente utilizzata per diversi anni per autenticare, in ambito governativo, i dati scambiati. L'algoritmo utilizza CBC con le operazioni di DES. I dati (da autenticare: qualsiasi tipo) sono raggruppati in blocchi di 64 bit contigui: . Se necessario il blocco finale viene riempito con dei bit posti a zero.

  1. Il messaggio viene cifrato con DES-CBC
  2. Si utilizza l'ultimo blocco cifrato o parte di esso come

Pasted image 20230904112227.png
L'immagine del libro indica il con il nome di , il motivo è che il generato da DES-CBC appartiene ad una famiglia di algoritmi detti Data Authentication Algorithm, quindi il prende il nome di Data Authentication Code. Ma il concetto è lo stesso.
Il (o ) ha una dimensione che varia, può essere l'intero blocco , oppure parte di esso. Ha una dimensione che può variare da a bit (l'intero blocco).

Questa tecnica è sicura?

Il codice serve per autenticare, se il ricevente ricevesse un messaggio modificato, il calcolato non corrisponderebbe con quello presente nel messaggio ricevuto.
Inoltre, non è possibile generare messaggi falsi, senza conoscere la chiave usata per generare il . L'attacco del compleanno non funziona anche se la probabilità di trovare una collisione tra i due insiemi e è elevata, poiché non è nota a terzi.

tramite funzione di hash: HMAC
...

Data una funzione di hash resistente alle collisioni, si genera il MAC applicando la funzione al messaggio e alla chiave segreta.

Esempio
...

Il messaggio viene suddiviso in blocchi:
Pasted image 20230907145631.png
l'ultimo blocco potrebbe venire riempito con degli zeri (padding) per raggiungere la dimensione di bit per blocco.

Definiamo come: Ovvero è uguale alle chiave , altrimenti se la chiave è più lunga di viene applicata la funzione di hash alla chiave, generando .
Definiamo come la chiave a cui viene aggiunto del padding di zero per raggiungere la dimensione di bit.
Definiamo anche delle costanti chiamate e :


  • Le costanti vengono ripetute per volte:
    Queste costanti vengono usate per aggiustare il padding delle chiavi.

Sicurezza
...

HMAC on opportune scelte per la funzione H è ritenuto sicuro contro attacchi di tipo chosen message.
La generazione di collisioni è possibile, tuttavia risulta non possibile autenticare il messaggio utilizzando la chiave, che in teoria è segreta solo a chi comunica.
HMAC è efficiente quanto la funzione di hash che viene utilizzata (due volte, dove la seconda viene applicato ad un input più corto, vedi immagine sotto).

Nell'immagine sotto .
Pasted image 20231122120550.png

Firma elettronica
...

L'autenticazione dei messaggi protegge le due parti comunicanti da manomissioni per mani di terzi. Tuttavia, essa non protegge le due parti da loro stessi.
Per esempio, supponiamo che John invia un messaggio autenticato a Mary, usando uno degli schemi sopra discussi, di cui mostriamo una panoramica di seguito, combinato con un MAC (DESC-CBC o HMAC):
Pasted image 20230907153920.png
Consideriamo la seguente disputa, che potrebbe nascere:

  1. Mary potrebbe creare un messaggio diverso e affermare che provenga da John. Mary dovrebbe semplicemente creare un messaggio e aggiungergli un codice di autenticazione usando la chiave che sia John che Mary condividono.
  2. John potrebbe negare l'invio di tale messaggio. Perché è possibile per Mary (ma anche per John stesso) creare messaggi con le caratteristiche sopra evidenziate. Effettivamente non ci sarebbe modo di provare che John non ha inviato tale messaggio.

In una situazione in cui non vi è piena fiducia tra chi invia i messaggi e chi li riceve è necessario avere qualcosa in più di una semplice autenticazione, ovvero la firma elettronica, le cui caratteristiche sono elencate di seguito:

  • deve verificare l'autore e la data e l'orario della firma
  • deve autenticare i contenuti al momento della firma
  • deve essere verificabile da parti terze per risolvere eventuali dispute.

La firma elettronica è ottenibile in due modi:

  • RSA con MD5/SHA-1
  • DSA con SHA-1 (che non vedremo)
RSA con MD5/SHA-1
...

Pasted image 20230907153615.png
Il messaggio del mittente da firmare passa per una funzione di hash (MD5 o SHA-1) , il risultato della funzione di hash è un codice hash di lunghezza fissa. Questo hash code viene cifrato utilizzando la chiave privata del mittente per formare la firma (signature). Sia il messaggio che la firma vengono poi trasmessi. Il destinatario riceve il messaggio e produce un codice hash. Il destinatario, inoltre, decifra la firma usando la chiave pubblica del mittente. Se il codice hash calcolato corrisponde con la firma decifrata, la firma è accettata come valida, dato che solo chi invia conosce la sua chiave privata, solo quest'ultimo può produrre una firma valida.

Con questo procedimento si ottengono:

  1. un procedimento di firma pari a quello reale, ma in forma virtuale
  2. il concetto di NO-repudation: il mittente non può ammettere di non aver inviato un dato messaggio.
Osservazione

La chiave pubblica del mittente è nota a tutti, in tal caso si dice che la firma è opponibile a terzi: chiunque può svolgere l'operazione di verifica (e questo rispecchia anche la realtà nel mondo reale).

Problemi della firma digitale
...
L'attacco del compleanno è possibile
...

Il mittente cifra il messaggio con la sua chiave privata, la firma e il messaggio vengono trasmessi, un malintenzionato li intercetta, quest'ultimo:

  • prende e ne genera un certo numero di varianti (messaggi equivalenti dal punto di vista semantico)
  • prende un falso e ne genera lo stesso numero di varianti
  • trova una collisione e convince il mittente a firmare il messaggio falsificato (non sempre possibile poiché entra in gioco il fattore umano)

Per il paradosso del compleanno, ovvero nel caso in cui è abbastanza grande, la probabilità che ci siano due messaggi, appartenenti ad entrambi gli insiemi, che collidono è maggiore .
L'attacco è possibile, poiché la firma è pubblica; con l'utilizzo di un questo attacco non funziona poiché non si conosce la chiave condivisa.

Attacco man-in-the-middle
...

Un utente terzo (), può intercettare il messaggio inviato dal mittente () e da lui firmato con la sua chiave privata. Se conosce la chiave pubblica di , cosa non improbabile, riesce ad ottenere il messaggio originale, modificarlo, per poi firmarlo con la sua chiave privata. Con l'inganno, , potrebbe fornire una chiave pubblica erronea (la sua) al destinatario (), che riconoscerebbe la firma di , convinto di riconoscere quella di . Il che compromette la sicurezza dell'algoritmo: deve essere certo di avere la corretta chiave pubblica di .

Nota

Firma digitale e firma elettronica sono utilizzati in modo intercambiabile.
Esistono diversi tipi di firma, che forniscono livelli di sicurezza differenti.
Ricapitolando, la firma digitale è ottenebile:

  • firmando un dato con la chiave privata (vulnerabile a MITM descritto sopra);
  • firmando un dato con la chiave privata per poi cifrarlo con la chiave pubblica del destinatario (sicuro, ma non protegge i partecipanti alla comunicazione da sé stessi)
  • generando un HMAC a partire da un dato con una funzione hash (attraverso una chiave simmetrica condivisa tra i partecipanti della comunicazione), firmando con la chiave privata tale HMAC e inviando i dati a destinazione.

Distribuzione di chiavi pubbliche
...

Sono state proposte diverse tecniche per la distribuzione delle chiavi pubbliche.
Idealmente tutte le proposte possono essere raggruppate nei seguenti schemi:

  • Annuncio pubblico;
  • Directory disponibile pubblicamente
  • Autorità di chiavi pubbliche
  • Certificati di chiavi pubbliche
Annuncio di chiavi pubbliche
...

A prima vista, può sembrare ovvio, in una cifratura a chiave asimmetrica rendere pubblica la chiave pubblica.
Come abbiamo visto questo risulta essere un problema per l'attacco man in the middle che abbiamo visto sopra.

Directory disponibile pubblicamente
...

Un maggior grado di sicurezza può essere raggiunto mantenendo una directory dinamica delle chiavi pubbliche che sia pubblicamente disponibile. La distribuzione e il mantenimento di tale directory dovrebbe essere compito di un'organizzazione fidata.
Un tale schema includerebbe i seguenti elementi:

  1. L'autorità mantiene una directory con una entry per ciascun partecipante del tipo: nome, chiave pubblica.
  2. Ogni partecipante registra una chiave pubblica con l'autorità responsabile della directory. La registrazione dovrebbe avvenire di persona o con qualche forma di comunicazione sicura e autenticata.
  3. Un partecipante può sostituire la chiave esistente con una nuova quando vuole, sia per voglia che perché, per esempio, la sua chiave privata (collegata a tale chiave pubblica) è stata compromessa.
  4. I partecipanti potrebbe anche accedere alla directory elettronicamente. A questo scopo l'ente potrebbe cifrare i dati con la sua chiave privata e renderli disponibili agli utenti che possiedono la sua chiave pubblica.

Pasted image 20231129200144.png
Questo schema è più sicuro degli annunci pubblici individuali, ma ha ancora delle vulnerabilità. Se l'attaccante riesce a calcolare/ottenere la chiave privata dell'autorità, allora l'attaccante potrebbe distribuire chiavi pubbliche contraffatte, impersonando qualsiasi partecipante e intercettare i messaggi inviati a qualsiasi partecipante.

Autorità delle chiavi pubbliche
...

Una maggiore sicurezza per la distribuzione delle chiavi pubbliche può essere ottenuta fornendo un controllo più stringente sulla distribuzione delle chiavi pubbliche dalla directory.
Uno scenario tipico è illustrato di seguito:
Pasted image 20231129201149.png
Un'autorità centrale mantiene una directory che contiene le chiavi pubbliche degli utenti.
Inoltre, come prima, si suppone che ogni partecipante conosce una chiave pubblica dell'autorità.
Seguono i passi:

  1. A invia un messaggio con timestamp all'autorità delle chiavi pubbliche contenente una richiesta della chiave pubblica attuale di B.
  2. L'autorità risponde con un messaggio che è cifrato usando la chiave privata dell'autorità (), in tal modo A è in grado di decifrare il messaggio usando la chiave pubblica dell'autorità. Pertanto A, è sicuro che il messaggio ha avuto origine dall'autorità. Il messaggio contiene:
    • la chiave pubblica di B;
    • la richiesta originale fatta da A all'autorità, per confrontare la risposta con la richiesta e verificare che non sia stata manomessa;
    • il timestamp originale dato in modo che A possa determinare che questo non è un vecchio messaggio dell'autorità contente una chiave diversa dalla chiave pubblica di B.
  3. A memorizza la chiave di B e la usa per mandargli messaggi
  4. B richiede la chiave di A per rispondergli
  5. L'autorità risponde come nel punto 2

A questo punto entrambi gli utenti hanno le chiavi e possono comunicare.

Si noti che i passi per ricevere la chiave non devono essere effettuati sempre, i comunicanti possono salvare la chiave, tuttavia dovranno comunicare con l'autorità per verificare l'autenticità e la validità della chiave.

Certificati di chiave pubblica
...

Lo scenario descritto prima è interessante, ma ha alcuni svantaggi.
Come prima per la directory pubblica dell'autorità è vulnerabile a manomissione.
Un altro approccio consiste nei certificati che possono essere usati da partecipanti per scambiare chiavi senza contattare l'autorità delle chiavi pubblica, ma come se fossero ottenute da essa. In sostanza un certificato consiste di:

  • una chiave pubblica
  • un ID del proprietario
  • e l'intero blocco firmato da una terza parte fidata.
    Tipicamente, la terza parte è un'autorità di certificazione (Certificate Authority, CA), come un'agenzia governativa.
    Un utente può presentare la sua chiave pubblica alla CA e ottenerne un certificato.
    Dal certificato si vede che vi è la firma della CA che può essere usata per verificare la validità della chiave.
    Un utente può comunicare il suo certificato ad altri utenti che possono effettuare verifiche simili da esso.
    Vogliamo ottenere che:
  1. qualsiasi partecipante deve poter leggere un certificato per determinare il nome e la chiave pubblica del proprietario del certificato;
  2. qualsiasi partecipante deve poter verificare che il certificato provenga dalla CA e non sia contraffatto;
  3. solo la CA deve poter aggiornare i certificati.
    Pasted image 20231129203331.png
  • e forniscono al destinatario il nome e la chiave pubblica del titolare del certificato.
  • è il timestamp che convalida l'attualità del certificato.
    Il timestamp contrasta il seguente scenario:
    la chiave privata di A viene rubata. A genera una nuova coppia di chiavi e se le fa certificare. Nel frattempo l'attaccante si spaccia per A, potendo leggere i messaggi che sono destinati ad A.
    A ha cambiato chiave, ma il suo vecchio certificato è ancora in circolo. Entra in gioco il timestamp: ad un certo punto esso non verrà aggiornato e il certificato scadrà ed esso non sarà più valido.

I certificati più recenti, consentono anche di aggiungere i certificati (se il proprietario lo richiede) in una lista di certificati revocati, consentendo agli utenti di verificare che il certificato per quell'utente non sia stato revocato, superando il limite precedentemente descritto.

Di seguito uno scenario che riassume il funzionamento delle PKI:
Pasted image 20230907164622.png
Consideriamo che Alice abbia bisogno di usare la chiave pubblica di Bob per inviargli un messaggio. Alice deve prima ottenere in modo affidabile e sicuro una copia della chiave pubblica della CA. Questo può essere fatto in diversi modi, dipende dalla politica della CA in questione.
Fatto ciò Alice verifica che la chiave di Bob sia ancora valida e che non sia stata revocata, se è ancora valido, Alice ottiene una copia del certificato di Bob (che contiene la chiave pubblica di Bob). Ora Alice può usare la chiave pubblica di Bob per inviargli un messaggio. Bob può anche utilizzare la sua chiave privata per firmare digitalmente dei documenti, in questo caso Bob può includere, insieme al documento firmato, il suo certificato, o presumere che Alice abbia modo di ottenerlo (come abbiamo descritto poco prima, per esempio).
Per verificare la firma di Bob, Alice utilizza prima la chiave pubblica della CA per garantire che il certificato sia valido, poi utilizza la chiave pubblica di Bob (ottenuta dal certificato) per verificare la firma di Bob, confermando l'autenticità del documento.