Ho bisogno di comunicare su socket TCP insicuri dove SSL / TLS non è disponibile. La seguente soluzione fornisce un mezzo sicuro di autenticazione e crittografia?
-
- Il client invia: nome utente
- Il server genera un token casuale (31 byte).
- Il server recupera una password salt and hash (bcrypt) dal database per il nome utente specificato.
- Server crittografa il token casuale tramite l'hash della password.
- Il client riceve: passwordSalt + encryptAes (token, passwordHash)
- Il client ottiene la passwordHash usando bcrypt sulla password e la password ricevuta salt.
- Il client ottiene il token decodificando il token crittografato con l'hash della password.
- Il client genera una "validazione" casuale (15 byte).
- Il client genera un hash del token utilizzando il sale di convalida e lo crittografa con il token.
- Il client invia: encryptAes (validationSalt + md5 (token + validationSalt), token)
- Il server ottiene l'hash decrittandolo con il token.
- Il server confronta se l'hash ricevuto è uguale a md5 (token). Se sono uguali, il client è stato autenticato.
- Il server genera un hash dell'hash della password utilizzando il sale di convalida, lo riempie con 15 byte casuali e lo crittografa con il token.
- Il client riceve: encryptAes (randomBytes (15) + md5 (passwordHash + validationSalt), token)
- Il client ottiene l'hash decodificandolo con il token.
- Il client confronta l'hash con md5 (passwordHash + validationSalt). Se sono uguali, il server è stato autenticato.
Tutti i dati verranno ora crittografati con il token generato dal server.
-
Il server è in Java, i client sono in C ++ (UE4).
La crittografia a chiave pubblica non è attualmente disponibile.
-
C'è qualche difetto o debolezza in questa soluzione?