Necesito comunicarme a través de sockets TCP inseguros donde SSL / TLS no está disponible. ¿La siguiente solución proporciona un medio seguro de autenticación y cifrado?
-
- El cliente envía: nombre de usuario
- El servidor genera un token aleatorio (31 bytes).
- El servidor recupera una contraseña salt y hash (bcrypt) de la base de datos para el nombre de usuario dado.
- El servidor cifra el token aleatorio mediante el hash de contraseña.
- El cliente recibe: passwordSalt + encryptAes (token, passwordHash)
- El cliente obtiene el PasswordHash utilizando bcrypt en la contraseña y el salteado de la contraseña recibida.
- El cliente obtiene el token descifrando el token cifrado con el hash de la contraseña.
- El cliente genera una sal de "validación" aleatoria (15 bytes).
- El cliente genera un hash del token utilizando el sal de validación y lo cifra con el token.
- El cliente envía: encryptAes (validationSalt + md5 (token + validationSalt), token)
- El servidor obtiene el hash descifrando con el token.
- El servidor compara si el hash recibido es igual a md5 (token). Si son iguales, el cliente se ha autenticado.
- El servidor genera un hash del hash de contraseña utilizando el sal de validación, lo rellena con 15 bytes aleatorios y lo cifra con el token.
- El cliente recibe: encryptAes (randomBytes (15) + md5 (passwordHash + validationSalt), token)
- El cliente obtiene el hash al descifrarlo con el token.
- El cliente compara el hash con md5 (passwordHash + validationSalt). Si son iguales, el servidor se ha autenticado.
Todos los datos se cifrarán ahora con el token generado por el servidor.
-
El servidor está en Java, los clientes están en C ++ (UE4).
El cifrado de la clave pública no está disponible actualmente.
-
¿Hay algún defecto o debilidad en esta solución?