Estoy creando una aplicación de Android que necesita ser muy segura. Para la autenticación en el servidor, utilizará la autenticación de 2 factores que incluye:
- username/password
- verificación de sms
No puedo usar certificados de cliente (con claves privadas), ya que en mi caso no sería práctico.
La contraseña se almacenará de forma segura en un servidor (probablemente hash y salt). Sin embargo, estoy teniendo problemas para descubrir la mejor manera de ingresar la contraseña en la aplicación de Android que se usará como cliente.
Actualmente estoy considerando 2 opciones:
- Solicite una contraseña al usuario cada vez que use el servicio
- Guarde la contraseña en la base de datos del teléfono y reutilícela cada vez que un usuario utilice el servicio
La primera opción es buena porque la contraseña nunca se almacena en el teléfono (excepto temporal en la RAM), pero la contraseña puede ser robada si un dispositivo es comprometido por un keylogger .
Leí sobre las formas de instalar un keylogger en un dispositivo Android y descubrí que la forma más común es hacer que la víctima instale un teclado personalizado que se usará para todas las aplicaciones.
Esto se explica por D.W. aquí: ¿Registradores de teclado en teléfonos inteligentes?
La segunda opción es inmune a los keyloggers (excepto la primera vez que el usuario ingresa una contraseña), pero tiene el riesgo de que algún malware descargue la base de datos. No he encontrado mucha información sobre la seguridad de SQLite en Android.
Además, la segunda opción conlleva un mayor riesgo si alguien obtiene acceso físico al dispositivo. Sin embargo, este riesgo puede reducirse mediante el uso de algún tipo de código pin para proteger el acceso a la aplicación.
Y el segundo factor de autenticación (SMS en mi caso) también puede verse comprometido, ya sea por el malware en el teléfono o por interceptar el SMS en el proveedor.
Entonces, mi pregunta es: ¿existe alguna forma conocida de volcar una base de datos de una aplicación en un dispositivo Android no rooteado, y cuál es la probabilidad de que eso suceda?