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 casualeRandomStringutilizzando 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. DecrittografaSecretAutilizzando la password inserita dall'utente per scoprireRandomString(solo se l'utente ha inserito la password corretta). CrittografaRandomStringutilizzando 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
SecretBal server insieme al timestamp utilizzato nella crittografia nel passaggio. - Il server decrittografa
SecretBconcatenando 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.