Estoy tratando de construir mi propia API REST basada en PHP para mi aplicación de Android y estoy un poco confundido por todas las cosas de autenticación de diferentes usuarios que se pueden encontrar en Internet. Así que quiero presentar mis consideraciones de seguridad y me gustaría recibir algunos comentarios.
Primero, quiero dejar claro que no quiero crear una API pública donde terceros puedan registrarse para obtener una clave de API, en cambio, solo quiero que los usuarios de mi aplicación puedan hacer todo el registro / inicio de sesión / enviando solicitudes de cosas. Así que mis planes son los siguientes:
-
Cuando un usuario desea registrarse, mi aplicación primero intercambia las claves generadas con mi servidor utilizando el método Diffie-Hellman. Para esto, mi servidor y mi aplicación almacenan información sobre el mismo número primo y la misma base (a menudo llamados p y g). Mi aplicación genera un secreto y crea una clave pública a partir de p, g y el secreto. La clave pública se envía al servidor, que responde con el envío de una ID de usuario en el formato UUID de Java y la clave pública del servidor según el secreto del servidor, p, y g. Al final, ambas partes son capaces de generar un secreto común. Toda la transacción se realiza utilizando TSL / SSL y puede verse aquí . En lugar de todo el secreto numérico, bastante largo, se almacena un hash SHA-512 en la base de datos y en la aplicación.
-
Después de intercambiar la clave, ahora puedo enviar la información de la cuenta del usuario (ID de usuario, contraseña y otras cosas) al servidor mediante TSL / SSL. El secreto de la aplicación se usa para HMAC asegurándose de que la instancia de la aplicación (el usuario) esté autorizada para enviarme estas cosas. Puedo verificar esto mientras almacené el secreto hash SHA-512 y el ID de usuario en la base de datos. La contraseña debe transmitirse para poder volver a iniciar sesión si el usuario se desconectó o si desea cambiar su contraseña. La contraseña está en hash siguiendo estas instrucciones. Después de iniciar sesión, se devuelve un token de inicio de sesión aleatorio al usuario que representa su estado de inicio de sesión. Este token de inicio de sesión también se almacena en la base de datos.
-
En lugar de enviar las credenciales del usuario con cada solicitud, el token de inicio de sesión se utiliza como credenciales de inicio de sesión y el secreto generado en el primer paso se utiliza para hacer HMAC. Entonces, si recibo una solicitud, primero puedo verificar si el usuario está autorizado para enviarme una solicitud realizando la autenticación del mensaje con HMAC y luego puedo verificar si el usuario ha iniciado sesión comparando el token de inicio de sesión transmitido con el almacenado en el base de datos. Esta transacción también se puede realizar con TSL / SSL pero no es necesario.
¿Es este un concepto válido o carece de algunos puntos cruciales, contiene malentendidos o hay algún otro tipo de problema con él?