La empresa para la que trabajo está creando una aplicación móvil que se comunica con dos API.
La primera API es de nuestra propiedad. Entre otras cosas, gestiona la autorización y autenticación de estilo OAuth2.
La segunda API no es de nuestra propiedad. Es una fuente de datos de terceros que solo ofrece autorización a través de los encabezados de Autenticación Básica HTTPS. Cada solicitud a esta API debe incluir un nombre de usuario y contraseña. Las credenciales de inicio de sesión para la segunda API son diferentes a las credenciales para la primera API.
Nos gustaría almacenar las credenciales de los usuarios para la segunda API para que el usuario no tenga que volver a ingresar su nombre de usuario y contraseña cada vez que abra nuestra aplicación móvil y realice una solicitud a la segunda API.
Hemos ideado la siguiente solución:
-
El usuario
-
abre nuestra aplicación móvil y se autentica con la primera API (me estoy saltando los detalles de la autenticación con la primera API porque no es relevante para el problema principal).
-
El usuario ingresa su nombre de usuario y contraseña para la segunda API.
-
La aplicación móvil genera una clave privada PGP, una clave pública y una frase aleatoria para la clave privada.
-
La aplicación móvil cifraría el nombre de usuario y la contraseña de la segunda API utilizando la clave pública.
-
La aplicación móvil carga la clave privada, el nombre de usuario cifrado y la contraseña cifrada en la primera API. La primera API almacena esos valores en una tabla de usuarios .
-
El dispositivo descarta la clave pública. La frase de contraseña para la clave privada se almacena de la forma más segura posible en el dispositivo (llavero del dispositivo, si está disponible).
-
Todas las solicitudes que se enviaron previamente desde la aplicación móvil a la segunda API ahora se enrutan a través de la primera API. La solicitud incluirá la frase de contraseña (almacenada solo en el dispositivo móvil) para que la primera API pueda usar la clave privada para descifrar el nombre de usuario y la contraseña y enviar la solicitud de Autenticación Básica HTTP a la segunda API.
Para obtener el nombre de usuario y la contraseña en texto simple, un pirata informático tendría que comprometer a ambos el dispositivo del usuario (para obtener la frase de contraseña) y nuestra primera API (para obtener la clave privada y cifrarla). iniciar sesión). Incluso si tanto el dispositivo móvil como nuestra primera API estuvieran comprometidos, el pirata informático solo obtendría una contraseña porque cada usuario genera su propia combinación de clave privada / frase de contraseña PGP.
Esto nos parece seguro, pero quería hacer una publicación aquí para ver si alguien podría señalar fallas o sugerir mejoras. Tenemos curiosidad por saber de qué manera podemos ayudar a proteger contra situaciones en las que el dispositivo móvil de los usuarios se vea comprometido. Tal como está ahora, si el dispositivo de los usuarios estuviera comprometido, el pirata informático no aprendería la contraseña de los usuarios, pero podría usar la frase de contraseña privada para enviar solicitudes ilegítimas y leer datos confidenciales de la segunda API.