2009-12-18 17 views
151

Si quiero guardar el nombre de usuario y la contraseña para usar dentro de una aplicación de Android, ¿cuál es la mejor manera de hacerlo? ¿Es a través de la pantalla de preferencias (pero qué pasa si el usuario no ve esto?), O aparece un cuadro de diálogo y le pide al usuario las credenciales? Si es así, tengo que mantener el estado de la aplicación. ¿Cómo haría esto?Android: ¿Almacenamiento de nombre de usuario y contraseña?

+2

http://stackoverflow.com/a/786588/1166727 Checa lo @RetoMeier (Líder Técnico para el Desarrollo de Android en Google) tiene que decir acerca de esto. –

+0

Si está buscando la forma más segura de almacenar las credenciales.Lea esta respuesta http://stackoverflow.com/a/20560574/730807 –

+2

@Legend ¿Cómo resolvió su problema? – Erum

Respuesta

96

La mayoría de las aplicaciones para Android y iPhone que he visto utilizan una pantalla inicial o un cuadro de diálogo para solicitar credenciales. Creo que es engorroso para el usuario tener que volver a ingresar su nombre/contraseña a menudo, por lo que el almacenamiento de esa información tiene sentido desde una perspectiva de usabilidad.

El asesoramiento de la (Android dev guide) es:

En general, se recomienda minimizar la frecuencia de pedir credenciales de usuario - para realizar ataques de suplantación de identidad más visible, y menos probable que tenga éxito. En su lugar, use un token de autorización y actualícelo.

Donde sea posible, el nombre de usuario y la contraseña no se deben almacenar en el dispositivo . En cambio, realice la autenticación inicial utilizando el nombre de usuario y la contraseña provistos por el usuario, y luego use un token de autorización específico del servicio de corta duración.

El uso del AccountManger es la mejor opción para almacenar credenciales. El SampleSyncAdapter proporciona un ejemplo de cómo usarlo.

Si esta no es una opción para usted por alguna razón, puede recurrir a las credenciales persistentes utilizando el mecanismo Preferences. Otras aplicaciones no podrán acceder a sus preferencias, por lo que la información del usuario no se expone fácilmente.

+36

Yo diría que es Es arriesgado mantener la información de contraseñas tal como está en las preferencias. En los teléfonos rooteados, es posible acceder al archivo de preferencias de una aplicación. Lo menos que puedes hacer es ofuscar la contraseña. – Jayesh

+44

Si alguien tiene su teléfono y es capaz de rootearlo, no hay mucho que pueda hacer para mantener sus datos seguros. No es una mala idea ofuscar la contraseña, pero en realidad no está agregando mucha más protección. Lo que es más importante es que hay muchas capas de seguridad ya integradas en el sistema operativo. Por supuesto, no quieres hacer nada estúpido para eludir esas medidas. Probablemente sea mejor usar un sistema como OAuth y almacenar un token en el dispositivo en lugar del nombre de usuario y la contraseña. – elevine

+0

También vea esta pregunta [enlace] (http: // stackoverflow.com/questions/785973/what-is-the-most-appropriate-way-to-store-user-settings-in-android-application) – Diederik

8

Debe utilizar el Android AccountManager. Está especialmente diseñado para este escenario. Es un poco engorroso, pero una de las cosas que hace es invalidar las credenciales locales si la tarjeta SIM cambia, por lo que si alguien desliza su teléfono y arroja una nueva tarjeta SIM, sus credenciales no se verán comprometidas.

Esto también le brinda al usuario una manera rápida y fácil de acceder (y posiblemente eliminar) las credenciales almacenadas para cualquier cuenta que tengan en el dispositivo, todo desde un solo lugar.

SampleSyncAdapter (como @Miguel mencionado) es un ejemplo que hace uso de credenciales de cuentas almacenadas.

+2

¿Dónde está documentado que AccountManager "invalidará las credenciales locales si la tarjeta SIM cambia"? – elevine

+0

No es que yo sepa. Sin embargo, es algo que he llegado a creer/aceptar/entender después de que algunos usuarios de mi aplicación tuvieran problemas de autenticación después de los SIM Swaps. –

+0

No lo veo en el código JavaDocs o AccountManager. Parece una buena característica, sería bueno verificarlo y comprender los detalles. – elevine

7

Creo que la mejor manera de asegurar su credencial es primero pensar en almacenar la Contraseña con cifrado en el archivo account.db que no podría estar fácilmente disponible en dispositivos no rooteados y en caso de dispositivo rooteado, el hacker debe necesitar la clave para descifrarlo

Otra opción es hacer toda su autenticación como lo hace Gmail. después de la primera autenticación con el servidor de Gmail. obtuviste el token de autenticación que se usaría en caso de tu contraseña. ese token se almacenaría en texto sin formato. Este token podría ser falso en caso de que cambie la contraseña del servidor.

la última opción Recomiendo habilitar la Autenticación de 2 factores & crear la Contraseña específica del dispositivo para su dispositivo. Después de perder el dispositivo, todo lo que necesita es deshabilitar ese dispositivo.

+2

¿Puedes publicar una fuente que diga que accounts.db está encriptada? ¿O dice que la contraseña específica debe estar encriptada? –

+0

@Riz, dónde almacenar la clave para el cifrado, entonces ... porque mi aplicación funciona sin Internet, por lo que no puedo obtenerla de la red – eRaisedToX

2

Con el nuevo (Android 6.0) de hardware de huellas digitales y API puede hacerlo como en this aplicación de ejemplo GitHub.

+6

El proyecto de ejemplo referenciado crea una clave en Android Key Store y la usa para crear un cifrado cifrado la contraseña. La contraseña y el cifrado cifrados se almacenan como cadenas codificadas en base64 en las preferencias compartidas. Tras la autenticación exitosa de huellas dactilares, la clave secreta se recupera del Android Key Store y se utiliza con el cifrado descifrado para descifrar la contraseña decodificada. – mjwheat

+0

@mjwheat Esto es muy útil para entender lo que está sucediendo en el ejemplo. ¡Gracias! Un pequeño error tipográfico: "... descifrar la contraseña codificada". – muetzenflo

2

Éstos se encuentran en orden de dificultad para romper su información oculta.

  1. tienda en texto plano

  2. almacén cifrado con una clave simétrica

  3. Uso de Android Keystore

  4. almacén cifrado con claves asimétricas

fuente: Where is the best place to store a password in your Android app

La propia Keystore se encripta utilizando el propio pin/contraseña de la pantalla de bloqueo del usuario, por lo tanto, cuando la pantalla del dispositivo está bloqueada, la Keystore no está disponible. Tenga esto en cuenta si tiene un servicio en segundo plano que podría necesitar acceder a los secretos de su aplicación.

fuente: Simple use the Android Keystore to store passwords and other sensitive information

Cuestiones relacionadas