Ho pensato a questo processo specificamente per fermare attacchi "man in the middle" e replay:
- L'utente digita il proprio nome utente nell'applicazione client.
- L'applicazione client invia il nome utente al server.
- Il server risponde con una stringa di testo (chiamiamola
SecretA
) che è la crittografia di una stringa casualeRandomString
utilizzando la password per il nome utente recuperato come chiave di crittografia !! vale a direSecretA = encrypt( message: RandomString, key: Password)
- L'utente digita la sua password e preme "accedi".
- L'applicazione client accetta la password immessa dall'utente e
SecretA
. DecrittografaSecretA
utilizzando la password inserita dall'utente per scoprireRandomString
(solo se l'utente ha inserito la password corretta). CrittografaRandomString
utilizzando la password utente concatenata con un timestamp (che scende ai microsecondi) come chiave, producendoSecretB
. vale a direSecretB = encrypt(message: RandomString, key: concat(Password, TimestampInMicroseconds))
- Il client invia
SecretB
al server insieme al timestamp utilizzato nella crittografia nel passaggio. - Il server decrittografa
SecretB
concatenando la password dell'utente con il timestamp ricevuto anche dal client. Se la decrittografia èRandomString
, l'utente si connetterà. - Il server nega l'accesso se il client del timestamp invia ha una differenza troppo grande con il tempo in cui il server riceve il messaggio.