Quali sono gli algoritmi per OTP basati su funzioni unidirezionali

Quali sono gli algoritmi per OTP basati su funzioni unidirezionali

Tra gli algoritmi matematici che generano una nuova OTP, quello più efficiente e che ha incontrato maggiore successo, è stato proposto da Leslie Lamport. Si tratta di un token software implementato originariamente dalla Bellcore con il nome di S/KEY, che non prevede la necessità di sincronizzazione temporale. La robustezza deriva dall’impiego reiterato di una generica funzione crittografica di hash unidirezionale.

Funzionamento del processo di generazione della One Time Password

Il funzionamento si articola nelle seguenti fasi::

  1. il client richiede al server di iniziare la procedura di autenticazione inviando lo username;
  2. il server, riconosciuto lo username, invia al client un challenge per consentire la generazione della One Time Password;
  3. il client genera la One Time Password e la invia al server per completare l’autenticazione;
  4. il server verifica la validità della One Time Password, autorizzando o negando l’accesso al servizio.

Durante la prima fase, il client invia al server l’identità dell’utente, che intende accedere al servizio. Il server, ricevuto lo username, lo utilizza come puntatore per esaminare una lista locale di utenti accreditati per l’accesso al servizio. La presenza dello username nel file delle credenziali memorizzato dal server, non garantisce l’accesso al servizio. Sulla base dello username inviato, il server costruisce un messaggio specifico di challenge per il client. Il messaggio di sfida contiene:

  • un identificatore della funzione di digest concordata tra client e server;
  • un numero N (con N maggiore di 1) che stabilisce il numero di iterazioni necessarie per generare la One Time Password;
  • un seme S, di lunghezza variabile, generato in maniera random dal server.

La concatenazione del numero N e del seme S rappresenta la componente challenge. Alla ricezione del messaggio di challenge, il client concatena le credenziali P digitate dall’utente (generalmente indicata come password locale, conosciuta soltanto dall’utente) al seme S ricevuto, ottenendo una stringa di lunghezza variabile che rappresenta l’ingresso della funzione hash prestabilita. La funzione hash viene applicata ricorsivamente per N volte, usando ogni volta l’output del processo come nuovo input. Il risultato finale della funzione di digest, viene trasformato in un numero binario a 64 bit, per mezzo di operatori XOR (OR esclusivo): ciò permette di avere un livello di sicurezza sufficientemente elevato e consente di non dovere digitare troppe cifre al momento dell’autenticazione. La versione compressa a 64 bit dell’uscita finale della funzione di digest rappresenta la notazione binaria della One Time Password, secondo il processo descritto in dettaglio nella figura seguente.

Processo di generazione della One Time Password
Processo di generazione della One Time Password

Nell’eventualità che il risultato debba essere digitato manualmente dall’utente, la OTP viene frammentata in sei blocchi da 11 bit (2 bit di padding sono aggiunti per ottenere i 66 bit necessari e sono destinati alla verifica dell’integrità della password) e ciascun blocco viene convertito in una singola parola, estratta da un vocabolario prestabilito di 2048 parole inglesi. L’utente, quando necessario, può eseguire questo algoritmo su un computer portatile o può stampare un elenco di password valide (passibile di furto), che contrassegnerà man mano che le utilizzerà.

Sicurezza per il processo di generazione della One Time Password

Per evitare una facile estrapolazione della OTP da parte di un hacker, lo schema prevede l’inserimento di password non inferiori a dieci caratteri. Il challenge inviato dal server consente all’utente di utilizzare una stessa password per più autenticazioni successive. Il seme S inviato dal server deve essere modificato ogni volta in cui il numero N scende a 1, reinizializzando la sequenza. Se non vengono mai inviati challenge (concatenazione di S e N) uguali, il client non produce mai due volte la stessa One Time Password, anche se l’utente mantiene la stessa password per molteplici accessi al servizio. Dovendo applicare la funzione di digest almeno una volta (N maggiore di 1), la password digitata dall’utente non viene mai trasmessa in chiaro al server. Alla ricezione della One Time Password, il server effettua la verifica delle credenziali dell’utente, come indicato in Figura 16. A tale scopo il server usa la One Time Password appena ricevuta come ingresso di un blocco di digest. Il risultato finale viene confrontato con quanto contenuto nel file delle credenziali memorizzato dal server: se il risultato del confronto è negativo l’accesso al servizio è negato, se positivo l’accesso al servizio viene consentito. Il lavoro del server si completa modificando il file delle credenziali, predisponendolo per accettare le nuove richieste. L’operazione prevede di decrementare di un unità il numero N associato allo username e di memorizzare la One Time Password appena trasmessa. Se durante questa operazione il numero N scende a zero, vengono generati casualmente un nuovo seme S* e un nuovo numero N*.

Differenza tra schema basato su funzioni unidirezionali e challenge/response

La differenza sostanziale tra lo schema appena descritto ed un generico schema challenge/response basato su funzioni di digest è che con lo schema S/KEY il server riesce a svolgere il suo ruolo anche senza conoscere la password, che rimane un esclusivo segreto dell’utente. In questo modo, anche se la lista locale contenente le credenziali degli utenti finisce nelle mani di un hacker, la non invertibilità della funzione di digest rende impossibile ricavare dalle informazioni in essa contenute le password utilizzate dagli utenti. L’operazione di estrapolazione della password, a partire dalle credenziali memorizzate sul server, è complicata dal fatto che per generare la One Time Password la funzione non invertibile è stata applicata dal client N volte.

Lo schema presentato funziona solo a regime. Per una corretta implementazione è necessario prevedere un opportuno meccanismo di inizializzazione e reinizializzazione. Il processo di reinizializzazione si ha ogni volta che:

  • N scende a zero;
  • l’utente decide di modificare la propria password.

La principale debolezza dello schema proposto è legata al fatto che, alla prima autenticazione, le credenziali inviate dal client vengono accettate senza essere di fatto verificate dal server. Per evitare che un hacker possa trarre vantaggio da questa vulnerabilità, sostituendosi fin dall’inizio al client, è necessario procedere alla fase di inizializzazione utilizzando un canale intrinsecamente sicuro, ad esempio accettando la prima autenticazione solo da client attivi sulla stessa macchina, che ospita il server. Dopo l’inizializzazione un hacker non può più sostituirsi al client, non disponendo della password.

Anche risolvendo le problematiche relative all’inizializzazione della sequenza, lo schema S/KEY presenta una seconda, per molti aspetti più grave, limitazione. Per ridurre il numero di informazioni che è necessario memorizzare, lo schema proposto viene generalmente implementato in modo da non rendere necessaria la memorizzazione, da parte del client, del numero di cicli N che sono serviti per produrre l’ultima One Time Password. Un hacker può sfruttare questa vulnerabilità operando, in condizione  man-in-the-middle , nel seguente modo:

  • intercetta il messaggio di challenge inviato dal server;
  • modifica la componente N del challenge sottraendovi un numero K < N;
  • invia il messaggio di challenge modificato al client; alla ricezione del messaggio, il client produce  la  One Time Password  applicando  ricorsivamente  la  funzione  di digest (N-K) volte, in base al contenuto del messaggio di sfida, quindi la invia al server;
  • intercetta la One Time Password prodotta dal client;
  • modifica la One Time Password applicando ricorsivamente la funzione di digest altre K volte;
  • invia la One Time Password prodotta al passo precedente al server.

In  questo  modo,  un  hacker  che  intercetta  la  One Time Password  entra  in  possesso  delle credenziali  per  accedere  (K-l)  volte  al  servizio.  L’hacker  infatti,  conoscendo  la  OTP  al passo (N-K), è in grado di generare le OTP ai passi (N-l,…, N-K+1, N-K), indispensabili per superare la verifica del server al momento della richiesta di accesso al servizio. Per scongiurare questa forma di attacco, tramite invio di messaggi di challenge con N alterato, è indispensabile che  il  generatore  OTP tenga traccia dei valori N inseriti nei precedenti messaggi di sfida inviati dal server.

Utente e One Time Password off-line

Per aiutare l’utente a ricordare a quale valore di N si è giunti, esistono dispositivi hardware personali per l’utente predisposti al calcolo della One Time Password off-line. L’utente è responsabile solo di digitare il seme S, trasmesso dal server al dispositivo personale e di inserire nel client la One Time Password, che appare a calcolo effettuato sul display del dispositivo. Questi dispositivi personali permettono all’utente di connettersi da qualsiasi terminale, senza richiedere ad altri componenti come il PC dell’utente, ad uno specifico programma client, il mantenimento di informazioni relative alle autenticazioni precedentemente concluse. Il dispositivo decrementa autonomamente il numero di cicli N, rendendo più difficile la conduzione di eventuali attacchi da parte di un hacker.

Pubblicato da Vito Lavecchia

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

Una risposta a “Quali sono gli algoritmi per OTP basati su funzioni unidirezionali”

Lascia un commento

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