Reading Time: 6 minutes

Segnatura dei messaggi

Talvolta la riservatezza dei dati non rappresenta un aspetto necessario per gli utenti di un servizio.

È abbastanza frequente che ai partecipanti interessi maggiormente uno strumento in grado di garantire l’autenticità e l’integrità dei messaggi scambiati.

Per alcuni utenti, questo fatto è conseguenza diretta delle leggi, vigenti nel loro Paese, che regolano l’utilizzo degli algoritmi di crittografia.

Esistono infatti stati in cui è vietata per legge la codifica di ogni tipo di messaggio M (a volte per motivi di siccurezza nazionale, molto più spesso perchè in tali paesi non esiste diritto alla privacy del cittadino).

Per alcuni utenti, la spinta determinante è semplicemente il desiderio di massimizzare la velocità di trasmissione dei dati, rinunciando ad algoritmi crittografici in grado di mantenere la confidenzialità dei dati, ma computazionalmente troppo onerosi.

L’integrità di un messaggio può essere appurata provvedendo alla sua “segnatura” prima della trasmissione. La segnatura di un messaggio si traduce nel calcolare una impronta digitale, denominata Message Integrity Code (MIC).

La sorgente è responsabile di calcolare il MIC di un messaggio prima di trasmetterlo.
La destinazione deve essere messa nella condizione di poter ripetere l’operazione che ha permesso alla sorgente di calcolare il MIC, al fine di stabilire l’autenticità del messaggio ricevuto.

La segnatura di un messaggio permette di stabilire una serie di fattori fondamentali:

  • l’autenticità della sorgente (provando di fatto l’identità della sorgente);
  • l’originalità del messaggio (ciascun MIC contraddistingue uno specifico messaggio e non può essere riutilizzato per la segnatura di messaggi diversi);
  • l’integrità del messaggio ricevuto (permette di rilevare eventuali modifiche introdotte nel messaggio durante la trasmissione);
  • non ripudio (con l’accettazione del principio di allegare al messaggio trasmesso il proprio MIC, la sorgente si assume piena responsabilità del contenuto del messaggio; firmando con le proprie credenziali uno specifico messaggio la sorgente non può sostenere, in un secondo momento, di non averlo mai inviato).

Funzioni Hash

Esistono due schemi alternativi che possono essere utilizzati per ottenere la segnatura di un messaggio M.

Il primo schema prevede l’uso di algoritmi crittografici, simmetrici o asimmetrici, in coppia con speciali funzioni matematiche denominate funzioni di digest (o funzioni hash o hash function).

Solo chi è a conoscenza delle chiavi da usare negli algoritmi crittografici prescelti può produrre e verificare il MIC di un messaggio.

Non occorre che la trasformazione crittografica utilizzata per produrre la segnatura sia invertibile.

Il secondo schema richiede esclusivamente l’adozione di una robusta funzione di digest. In tal caso la segnatura può essere prodotta da chiunque è in possesso del messaggio originale.

Questa tecnica è frequentemente utilizzata per trasmettere credenziali utente (passsword) su un canale intrinsecamente insicuro.

Una funzione di digest H( ), per poter essere usata nella produzione di MIC, generalemente deve possedere le seguenti proprietà:

  • poter essere applicata a messaggi di qualsiasi dimensione
  • produrre output di lunghezza limitata e prestabilita
  • essere computazionalmente semplice da calcolare hash = H(M)
  • essere computazionalmente impossibile, noto l’output, ricavare M tale che hash = H(M)
  • essere computazionalmente impossibile individuare un M1 diverso da M2 tale che H(M1) = H(M2) (se questo accade si dice che la funzione H( ) presenta casi di collisione)
  • essere computazionalmente improbabile trovare due valori M1 e M2, entrambi significativi, tali che H(M1) = H(M2)

Le prime tre proprietà sono condizioni necessarie ma non sufficienti.

Solo se la funzione selezionata rispetta anche le restanti proprietà, può essere utilizzata all’interno di uno schema per generare la segnatura robusta di messaggi trasmessi attraverso Internet e/o altri canali di comunicazione intrinsecamente insicuri.

Ogni volta che il messaggio M è noto, o comunque a conoscenza di più partecipanti, la segnatura del messaggio deve essere realizzata utilizzando componenti segrete riconducibili univocamente ad uno dei partecipanti.

I segreti usati non devono essere deducibili dalla segnatura prodotta, per non compromettere l’intero sistema.

Lo schema più diffuso per determinare l’integrità di un messaggio M prevede l’utilizzo di un generico algoritmo di crittografia a chiave pubblica e chiave privata, in coppia con una opportuna funzione di digest.

Alice e Bob, possono effettuare il test sull’integrità e autenticità del messaggio M scambiato procedendo come segue:

  1. Alice e Bob adottano un comune algoritmo asimmetrico e una comune funzione hash.
  2. Alice invia a Bob la propria chiave pubblica.
  3. Alice applica la funzione di digest al messaggio M da trasmettere.
  4. Alice produce una segnatura del digest (vale come MIC) utilizzando la propria chiave privata.
  5. Alice invia a Bob il messaggio M (anche in chiaro) allegando anche il MIC.
  6. Bob calcola il digest atteso usando come input il messaggio M ricevuto.
  7. Bob decodifica il MIC allegato al messaggio, usando la chiave pubblica di Alice.
  8. Bob confronta i risultati ricavati ai passi 6 e 7; se i due digest coincidono la segnatura del messaggio è valida.

La segnatura del messaggio M potrebbe essere generata senza ricorrere ad alcuna funzione di digest, codificando l’intero messaggio con la chiave privata della sorgente prima di trasmetterlo.

Il principale guadagno conseguibile adottando lo schema precedente sta nel risparmio computazionale.

Gli algoritmi asimmetrici infatti, sono incommensurabilmente più lenti di qualsiasi funzione di hash.

Per questo, codificare solo il digest, di breve lunghezza, significa ridurre moltissimo il carico di lavoro richiesto al proprio elaboratore (rispetto a codificare l’intero messaggio M).

Inoltre allegando il digest cifrato al messaggio M si consegue anche un consistente risparmio di banda rispetto a quanto accadrebbe se costretti ad allegare l’intero messaggio cifrato C.

La segnatura dei messaggi può essere ottenuta anche senza far ricorso ad algoritmi crittografici reversibili.

È possibile trasferire un messaggio M e provarne l’integrità sfruttando la componente segreta condivisa in maniera diversa.

Alice e Bob, che per ipotesi condividono un comune segreto KAB, possoo verificare un messaggio adottando la seguente procedura:

  1. Alice e Bob stabiliscono di usare una comune e robusta funzione di hash.
  2. Alice e Bob condividono un comune segreto KAB.
  3. Alice concatena il messaggio M ed il segreto KAB.
  4. Alice produce una segnatura del messaggio applicando la funzione di digest al risultato del passo precedente.
  5. Alice invia a Bob il messaggio M (in chiaro) allegando il MIC.
  6. Bob calcola il digest atteso, concatenando al messaggio M il segreto KAB condiviso con Alice.
  7. Bob confronta il risultato al passo precedente con il MIC inviato da Alice; se i due digest coincidono, lasegnatura del messaggio è valida.

La funzione H( ) usata nella prduzione del MIC è non invertibile e nota a tutti i partecipanti (hacker compresi).

Applicando due volte lo stesso input il risultato prodotto non cambia. Pertanto, fissato il segreto condiviso KAB, la segnatura valida di un messaggio M è una e una sola.

Un attaccante, non a conoscenza del segreto, può cercare di ingannare il ricevente usando un input diverso che produce lo stesso risultato.

Per questo le funzioni hash candidate all’impiego in ambito dei servizi Internet devono essere tali da non incappare (almeno frequentemente) in simili “collisioni”.

Altri usi delle funzioni hash

Le funzioni di digest possono essere utilizzate anche per altri scopi.

Una loro applicazione molto diffusa è all’interno delle procedure di autenticazione che gli utenti devono superare per poter accedere ai servizi Internet.

Per evitare che un attaccante possa riutilizzare l’output di una funzione hash, contenente credenziali valide per l’autenticazione di un utente legittimo, è necessario che nel processo non venga mai usato lo stesso input.

Poichè il segreto condiviso varia raramente, se la funzione di hash è usata a supporto dell’autenticazione, è opportuno concatenare alla credenziale utente una componente one time (comunemente detta nonce).

Di fatto le funzioni di digest costituiscono, per la loro semplicità computazionale, una componente fondamentale di molteplici applicazioni e servizi Internet.

Infatti, nonostante la limitazione di non assicurare la riservatezza dei dati, in tutti i principali protocolli di comunicazione e applicativi, se ne fa largo uso.

Il fondamentale vantaggio delle funzioni di hash consiste nella capacità di produrre un output pseudo random, di lunghezza prefissata indipendentemente dalla lunghezza dell’input.

Per ottenere questo risultato gli schemi proposti prevedono la frammentazione del messaggio in ingresso e la ricorsione della funzione non invertibile alla base del processo di creazione del digest.

Tale schema si applica ai principali algoritmi di hash che rappresentano lo stato dell’arte: MD5, SHA e RIPEMD-160.

error: Content is protected !!

La maggior parte dei contenuti del blog ComputerSec vengono pubblicati a beneficio di tutti e in modo completamente gratuito.
Tuttavia per supportare il blog, e per avere ulteriori vantaggi, puoi decidere di abbonarti e sfruttare al 100% tutti i contenuti!
Abbonati Ora!

Complimenti! Ti sei iscritto alla nostra Newsletter

C'è stato un errore durante l'invio della richiesta. Per favore riprova.

Computer Security will use the information you provide on this form to be in touch with you and to provide updates and marketing.