Pensé en este proceso específicamente para detener los ataques y ataques de "hombre en el medio":
- El usuario escribe su nombre de usuario en la aplicación cliente.
- La aplicación cliente envía el nombre de usuario al servidor.
- ¡El servidor responde con una cadena de texto (llamémosla
SecretA
) que es el cifrado de una cadena aleatoriaRandomString
usando la contraseña para el nombre de usuario recuperado como clave de codificación! es decir,SecretA = encrypt( message: RandomString, key: Password)
- El usuario escribe su contraseña y presiona "iniciar sesión".
- La aplicación cliente toma la contraseña ingresada por el usuario y
SecretA
. DescifraSecretA
usando la contraseña ingresada por el usuario para descubrirRandomString
(solo si el usuario ingresó la contraseña correcta). Cifra elRandomString
usando la contraseña de usuario concatenada con una marca de tiempo (que se reduce a los microsegundos) como la clave, produciendoSecretB
. es decir,SecretB = encrypt(message: RandomString, key: concat(Password, TimestampInMicroseconds))
- El cliente envía
SecretB
al servidor junto con la marca de tiempo utilizada en el cifrado en el paso. - El servidor descifra
SecretB
concatenando la contraseña del usuario con la marca de tiempo que también recibió del cliente. Si el descifrado esRandomString
, entonces el usuario inicia sesión. - El servidor deniega el acceso si el cliente de marca de tiempo envía una diferencia demasiado grande con la hora en que el servidor recibe el mensaje.