4. Password One-Time 

Una password one-time è una password che può essere usata validamente una sola volta. Dopo l'uso, la password viene scartata. Il vantaggio per la sicurezza consiste nel fatto che una password intercettata si rivela inutile per un intruso. L'inconveniente maggiore di questo sistema è che gli utenti devono gestire una lista di password o devono avere un software che calcoli la password one-time al volo. Un altro problema consiste nella necessità di dover rigenerare la lista di password ogni volta che si esaurisce. 

Il sistema di autenticazione One-Time Password (OTP) è stato sviluppato presso i laboratori della Bell Comunications Research (Bellcore) dove è stato implementato con il nome di S/KEY. OTP è intrinsecamente resistente all'attacco reply, dato che le informazioni che vengono trasmesse sulla rete non sono sufficienti per accedere in un secondo momento al server.Un altro vantaggio di OTP consiste nel fatto che il database delle password è utile per verificare i dati forniti dagli utenti, ma non consente di ottenere i dati necessari per entrare nel sistema, perciò è del tutto inutile rubarlo.

L'idea su cui si basa OTP è piuttosto semplice: esistono delle funzioni, dette hash, che hanno la proprietà di non essere facilmente invertibili. Ciò significa che se si usasse una di tali funzioni, detta f, per elaborare un certo dato x, non sarebbe possibile risalire al valore di x a partire da f(x); comunque, è sempre possibile usare la funzione hash per verificare se un valore y possa o meno essere uguale a x avendo a disposizione soltanto f(x): se f(y) fosse uguale a f(x) allora y potrebbe essere uguale a x, altrimenti x e y sarebbero necessariamente differenti. Ovviamente, questa verifica ha senso poiché è molto improbabile che presi due valori x e y a caso, la funzione hash fornisca due risultati uguali.

Come potrebbe un utente usare le funzioni hash per convincere gli altri della sua identità? Si immagini di applicare f due volte ad un dato x, giungendo così a f(f(x)) e si immagini che l'utente comunichi ad un altro utente o ad un computer, sia la funzione usata sia il risultato dell'operazione. L'altra parte non può conoscere né il valore di x né quello di f(x), dato che la funzione usata non è invertibile, però può verificare se un valore y qualsiasi che gli sia fornito può essere usato per ottenere f(f(x)); basta applicare una volta la funzione hash a y e confrontare il risultato ottenuto con f(f(x)); se tale confronto dà esito positivo, il soggetto verificatore può essere ragionevolmente sicuro che y sia proprio f(x), e di conseguenza può considerare verificata l'identità dell'utente. Se poi tale soggetto si segnasse da qualche parte il valore di y, potrebbe autenticare l'utente una seconda volta: basterebbe che quest'ultimo gli inviasse proprio x, perché il verificatore possa applicarvi la funzione hash e quindi verificare che f(x) è proprio uguale a y. Questo procedimento si presta ad essere esteso a piacimento, semplicemente fornendo al verificatore il valore calcolato applicando n volte a x la funzione hash: in questo modo il verificatore è in grado di provare n volte l'identità dell'utente. I valori ottenuti applicando la funzione hash a x sono detti password one-time, proprio perché possono essere usati dall'utente una volta soltanto.

 OTP usa come funzioni hash gli algoritmi MD4 e MD5 (MD sta per Message Digest) e SHA (Secure Hash Algorithm). Questi algoritmi ricevono come ingresso una stringa di qualunque dimensione e restituiscono in uscita un valore di 128 bit (MD4 e MD5) o 160 bit (SHA). Generalmente MD4 è ritenuto l'algoritmo meno sicuro dei tre, anche se non è stato ancora violato, mentre SHA è considerato il più sicuro, per il fatto che genera valori a 160 bit. Affinché chi verifica possa controllare l'identità dell'utente, questi deve fornirgli il valore calcolato applicando n volte a x la funzione f. Tale valore può essere passato in modo diretto oppure indiretto: nel primo caso l'utente trasmette il valore finale, mentre nel secondo trasmette sia x sia n per consentire al verificatore di calcolarselo da solo. Ovviamente il metodo diretto si presta ad essere usato su ogni tipo di canale, mentre quello indiretto soltanto su quelli sicuri.

Un altro punto lasciato in sospeso riguarda la natura di x: x è definito come la combinazione di una passphrase fornita dall'utente ad un seed. La passphrase è un testo di almeno 10 caratteri che deve essere conosciuto soltanto dall'utente, mentre il seed è un codice alfanumerico lungo al massimo 16 caratteri che identifica il server e serve soltanto per consentire all'utente di usare la medesima passphrase con più server. Per ottenere il valore di x occorre costruire una stringa ottenuta dalla concatenazione della passphrase con il seed, quindi passare la stringa attraverso la funzione hash prescelta. E' ovvio che a parità di passphrase se si hanno due valori x1 e x2 ottenuti con seed differenti, anche x1 e x2 non possono essere uguali e quindi generano password one-time diverse.

Un particolare importante dello standard OTP è che le uscite delle funzioni hash sono combinate per mezzo di operatori OR-esclusivo per fornire numeri di 64 bit: ciò permette di avere un livello di sicurezza sufficientemente elevato e consente di non dovere digitare troppe cifre al momento dell'autenticazione. Grazie a questo accorgimento si può limitare il numero delle cifre della password one-time a 16, usando la notazione esadecimale. In realtà non è semplice digitare in modo esatto 16 cifre prive di senso; per questo motivo i progettisti di OTP hanno pensato di introdurre una rappresentazione alternativa, basata su un dizionario standard di 2048 parole inglesi non più lunghe di 4 caratteri, in modo tale da poter convertire ogni numero di 64 bit in una sequenza di 6 parole; tale rappresentazione prevede che i 2 bit aggiuntivi siano destinati alla verifica dell'integrità della password.