Almacenar la contraseña en sqlite vs pedirle al usuario que la escriba cada vez

2

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?

    
pregunta user3362334 20.03.2017 - 15:27
fuente

3 respuestas

3

Hay mucho que desempaquetar con esta pregunta, y haré todo lo posible para responder a la pregunta, notando que no soy un desarrollador de Android.

Para empezar, la esencia de la autenticación de dos factores en la forma tradicional, es algo que tiene y algo que sabe . Si permite el almacenamiento de una contraseña en el dispositivo, está mitigando más o menos cualquier beneficio de seguridad que tendría al implementar 2FA, ya que el simple hecho de poseer el dispositivo podría llevar a un compromiso. Dicho esto, en mi opinión, no debería proporcionar la capacidad de almacenar la contraseña en el dispositivo.

  

La contraseña se almacenará de forma segura en un servidor (probablemente hash y salt)

Si quieres que tu aplicación sea segura, definitivamente sal y hash aleatoriamente.

También puede valer la pena señalar que NIST ha recomendado no utilizar SMS para dos autenticación de factores. así que quizás quieras ver algo como Google Authenticator.

No puedo decir si las bases de datos SQLite se pueden volcar o no en teléfonos no rooteados, pero dada la ubicuidad del malware para Android, operaría bajo el supuesto de que el teléfono podría verse comprometido por la instalación no intencionada de una aplicación maliciosa.

    
respondido por el DKNUCKLES 20.03.2017 - 15:41
fuente
1

Es solo mi opinión, pero no debes intentar reinventar una rueda cuadrada cuando las redondas están alrededor. Como antiguo usuario de Unix, creo que una buena aplicación debería hacer una sola cosa y hacerlo lo mejor posible, en lugar de intentar hacer todo, incluso traer un café.

Suponiendo que su aplicación no es un almacén de contraseñas, ni siquiera debería considerar proporcionar ninguna función de administración de contraseñas: si uno de sus usuarios desea que su contraseña se almacene en algún lugar para que no tiene que escribirlo en cada conexión, solo déjelo usar su administrador de contraseñas favorito. La forma, él decidirá si prefiere un almacenamiento local, un almacenamiento en la nube o ningún almacenamiento, y el problema de tratar con los registradores de teclas será para el desarrollador del administrador de contraseñas: la pregunta ya debe estar dirigido por cualquier administrador de contraseñas correcto ...

En mi humilde opinión, solo debe documentar cómo usar algunos administradores de contraseñas bien conocidos como el excelente Keypass, 1Password o Lastpass en su aplicación, y simplemente concentre sus esfuerzos en sus propias funciones.

    
respondido por el Serge Ballesta 20.03.2017 - 16:33
fuente
0

Una opción mejor es una que no es una de las dos que está considerando: un esquema basado en token de acceso como OAuth . Esto tiene el efecto de recordar al usuario, pero pueden revocar un token específico sin cambiar toda la cuenta. Esto es útil si pierden un dispositivo, por ejemplo. También puedes hacer que los tokens caduquen de vez en cuando, lo que evita que un token robado otorgue al acceso permanente una contraseña robada.

Google proporciona un conjunto de tutoriales sobre cómo manejar la autenticación de cuenta en Android. Probablemente debería leer eso, o al menos investigar más en AccountManager .

    
respondido por el Xiong Chiamiov 20.03.2017 - 16:06
fuente

Lea otras preguntas en las etiquetas