Per costruire un sistema di risposta alla sfida sicuro in cui la sfida viene dimenticata dal server prima che la risposta venga restituita, devi assicurarti che un intruso non possa inviarti una risposta a una sfida che non hai inviato o una sfida rivolta a qualcun altro o una sfida vecchia o già utilizzata.
Prima di tutto, puoi assicurarti che tutte le tue sfide siano autentiche "firmandole" in qualche modo. Non è necessario utilizzare i tradizionali protocolli di firma per fare ciò poiché non è una firma generica. Invece, prendi la tua sfida esistente, aggiungi una stringa "segreta" e prendi un hash crittografico del risultato (ad esempio SHA-256). Quindi includere l'hash come parte della sfida. Quando si ottiene una risposta dal client, è possibile verificarne l'autenticità ripetendo il processo e confrontando l'hash trasmesso con quello calcolato. Se lo spazio è un premio, devi solo includere un piccolo sottoinsieme dell'intero hash.
Per assicurarti che le sfide non possano essere utilizzate per autenticare contro l'account di qualcun altro, puoi rendere la parte di identificazione dell'account della sfida stessa o parte dell'autenticazione sopra descritta. Cioè, invece di appendere una stringa "segreta", puoi aggiungere sia il nome utente AND una stringa segreta, e poi l'hash THAT. Allo stesso modo, puoi collegare le sfide a un dato ID di connessione, indirizzo IP dell'host, ecc., Incorporando tali informazioni nella firma.
Infine, puoi rendere le sfide sensibili al fattore tempo incorporando l'ora corrente nel contenuto della sfida e puoi impedire gli attacchi di riproduzione dando a ogni sfida un ID e non consentendo risposte che si riferiscono a un ID già utilizzato.
Il tuo sistema può apparire come questo, ad esempio. Si noti che questo esempio è appena fuori dalla mia testa, mentre il vostro dovrebbe probabilmente essere un po 'più sofisticato di questo. Ma questo almeno dimostra come un sistema del genere potrebbe funzionare.
Client:
say: My name is "Alice"
Server:
* super-secret key is "swordfish"
* sha1sum("Alice|30Nov11@12:03|swordfish")="4f9167de1e754d...."
say: Please sign this string: "Alice|30Nov11@12:03|4f9167de1e"
Client:
* password is "mustang"
* sha1sum("Alice|30Nov11@12:03|4f9167de1e|mustang")="6148f8d7bd9eeb6...."
* say: Challenge was "Alice|30Nov11@12:03|4f9167de1e"
* say: Response is "6148f8d7bd9eeb6c9156c5be385e96871721f6df"
Server:
* verify that user's name is in the challenge
* verify that timestamp is no more than 5 minutes in the past
* verify that "4f916..." corresponds to challenge with checksum replaced by "swordfish"
* verify that response is challenge with user's password appended