# S/KEY

In crittografia e in informatica S/KEY è un sistema one-time password sviluppato per l'autenticazione su sistemi operativi Unix-like, in particolare dai cosiddetti 'dumb terminal' o da computer pubblici nei quali l'utente non vuole scrivere una password a lunga scadenza. La reale password dell'utente viene combinata in un dispositivo offline con un piccolo insieme di caratteri e un contatore decrementale in modo da formare una password monouso. Dato che la password è utilizzabile solo per una sessione, l'utilizzo di sniffer diventa inutile.

## Descrizione

L'insieme di caratteri non cambia finché il contatore decrementale non raggiunge lo zero. È così possibile preparare una lista di password single-use che l'utente può portare con sé. Alternativamente, l'utente può presentare la password, i caratteri e il valore del contatore desiderato ad un calcolatore locale per generare la password appropriata che può quindi essere trasmessa attraverso la rete in chiaro. Questa seconda opzione è la più comune e si riduce praticamente ad una forma di autenticazione challenge-response.
S/KEY è supportato in Linux tramite PAM, OpenBSD, NetBSD e FreeBSD. Inoltre una generica implementazione open source permette l'utilizzo su ogni altro sistema. S/KEY è un marchio commerciale di Telcordia Technologies, conosciuta comunemente come Bell Communications Research (Bellcore).
Ci si riferisce a S/KEY anche con il nome di 'schema di Leslie Lamport', dal nome dell'autore. È stato sviluppato da Neil Haller, Phil Karn e John Walden nei laboratori Bellcore sul finire degli anni 80. Al momento della scadenza dei brevetti sulla crittografia a chiave pubblica e l'ampio utilizzo di SSH e altri protocolli di crittografia che possono rendere sicura l'intera sessione, non solo la password, S/KEY è caduto in disuso. SecurID è uno schema one-time password simile che ancora risulta ampiamente utilizzato perché, a differenza di S/KEY, fornisce autenticazione a due fattori, richiedendo un token fisico che difficilmente può essere riprodotto.

### Generazione della password

Il server è il computer che eseguirà l'autenticazione:
* Si inizia con una chiave segreta w. Questo segreto può essere fornito sia dall'utente che generato da una macchina. D'altro canto se il segreto viene svelato, la sicurezza di S/KEY viene compromessa.
* H è una funzione di hash che produce una password one-time;
* H è applicata n volte a w, producendo quindi un insieme di n password one-time;
* La chiave segreta iniziale w è scartata;
* All'utente vengono fornite le n password, stampate in ordine inverso;
* Le ultime n-1 password vengono scartate dal server. Solo la prima password, in cima alla lista dell'utente, viene memorizzata sul server.

### Autenticazione

Dopo la generazione della password, l'utente ha un foglio di carta con n password. La prima è la stessa password che il server ha memorizzato e che non sarà utilizzata per l'autenticazione. Al suo posto verrà utilizzata la seconda:
* L'utente fornisce al server la seconda password della lista e la cancella.
* Il server tenta di calcolare H(pwd) dove pwd è la password fornita. Se H(pwd) produce la prima password (quella che il server ha memorizzato, allora l'autenticazione è corretta. Il server memorizzerà quindi pwd come referenza per la successiva autenticazione.
Più in generale, fornendo la password i, verrà calcolata H(i) con la password memorizzata i-1.

## Sicurezza

La sicurezza di S/KEY confida sulla difficoltà di invertire la funzione di hash. Si supponga che un attaccante ottenga una password i che è stata utilizzata per una precedente autenticazione. Tale password è inutile per le autenticazioni successive perché ogni password può essere usata una volta soltanto. Se la password i sniffata dall'attaccante fosse l'ultima utilizzata, si potrebbe tentare di invertire la funzione di hash in modo da ottenere la prossima password. Tale operazione risulta estremamente difficoltosa.
S/KEY è comunque vulnerabile ad un attacco man in the middle. È anche vulnerabile a certe race conditions, come nel caso in cui un attaccante utilizzasse uno sniffer per trovare i primi N-1 caratteri per poi utilizzare rapidamente un bruteforce per scoprire il restante carattere. Questo tipo di vulnerabilità possono essere evitate utilizzando ssh, SSL, SPKM o un altro metodo di trasmissione criptata.

## Utilizzo

Il sistema S/KEY utilizza dei numeri in 64 bit. Mentre nell'usabilità umana, ciascun numero viene mappato a sei brevi parole, ogni parola può contenere massimo quattro caratteri, attraverso un dizionario costituito da 2048 parole accessibili al pubblico. Ad esempio, una mappatura numerata a 64 bit potrebbe essere "ROY HURT SKI FAIL GRIM KNEE".