Cuando la aplicación móvil se conecta al back-end y solicita los datos, el back-end debe asegurarse de que el solicitante sea el que pretende ser. Por lo tanto, necesitamos alguna forma de identificar de forma segura la aplicación en un dispositivo.
Mientras buscaba las mejores prácticas en la identificación de dispositivos móviles contra el back-end móvil, he encontrado un conjunto de soluciones, desde la identificación por identificación del dispositivo hasta el uso de tokens de vida relativamente corta (tokens oAuth2, tokens JWT o simplemente identificadores de sesión)
Pero todos los métodos que he encontrado incluyen la transferencia de algunas cadenas reutilizables (tokens) que son vulnerables al interceprion. Reutilizable, lo que significa que si alguien tiene la cadena, puede usarla para actuar en nombre del dispositivo.
Incluso en https, cuando el usuario se encuentra en un entorno cerrado (por ejemplo, una red corporativa), se le puede solicitar que instale un certificado adicional y esa cadena puede interceptarse y usarse para el acceso no autorizado a los datos del usuario ("ataque mitm" ).
Puedo pensar en los siguientes methos para evitar este ataque, a la vez que mantengo las cosas relativamente simples:
- La aplicación móvil, en un dispositivo, durante la llamada inicial de "registro" genera un par de claves pública / privada. La clave privada se guarda de forma segura en un dispositivo.
- La clave pública se envía al back-end y se almacena junto a la ID del dispositivo (aclaración: se realiza una vez en la vida útil del dispositivo identificado, antes de cualquier otra acción de autenticación que permita actuar en nombre del usuario)
- En cada dispositivo de solicitud envía una cadena corta "aleatoria" (GUID, o la hora actual, o algo que se obtuvo de back-end), y esta cadena, cifrada con una clave privada
- El back-end comprueba si la cadena "aleatoria" es lo suficientemente aleatoria (no se usó antes) y si los datos cifrados se pueden descifrar con una clave pública a esa cadena muy "aleatoria". Y, si es así, confirma la identidad del dispositivo.
Esto parece bastante simple (tanto iOS como Android tienen infraestructura para PKI).
Y aún seguro (no es vulnerable a un ataque mitm, es imposible imitarlo).
La pregunta es: ¿por qué no se usa ampliamente (o al menos se discute ampliamente)?
¿Es algo estándar, que simplemente no sé cómo nombrar correctamente?
¿Se sabe que es una mala práctica por alguna razón?