2011-11-02 21 views
15

¿Cuál es una buena práctica para guardar el nombre de usuario y la contraseña en el dispositivo?Android: ¿dónde deberíamos guardar el nombre de usuario y la contraseña en la memoria del dispositivo?

He tenido muchas respuestas en Stackoverflow y ahora estoy un poco confundido.

Estoy trabajando en una aplicación de correo electrónico y quiero que mi usuario se sienta absolutamente seguro mientras lo usa.

Algunas personas sugieren que debemos encriptarlo y guardarlo en SharedPreference. Algunos sugieren que no deberíamos guardarlo en ningún dispositivo.

Solo quiero que los detalles del usuario se almacenen en el lugar más seguro posible.

Cualquier ayuda, sugerencias sería muy apreciada.

Gracias.

Respuesta

17

Debe guardar las credenciales de los usuarios usando la clase AbstractAccountAuthenticator. No solo es súper seguro, también hace que tu aplicación se sienta más integrada con Android. ¿Alguna vez ha ido a la pantalla "Cuentas" en su configuración de Android y ha visto sus cuentas de Facebook, Twitter y GMail allí? Eso es porque están usando un Autentificador de cuenta. Además, le permite asociar URI/ContentProviders con cuentas de usuario particulares. Para ver un ejemplo realmente completo (pero complicado) de todo esto, consulte el ejemplo SampleSyncAdapter.

+0

Gracias por esta brillante sugerencia. Lo estoy probando en este momento. :) Te dejaré saber si enfrentaré algún problema al aplicar esta técnica. Gracias de nuevo. – Varundroid

-3

SharedPreference es la mejor opción.

  1. Facilidad de uso
  2. Sólo elimina cuando el usuario borra los datos de la App
  3. flexibilidad para cambiar los valores cuando el usuario utiliza otro conjunto de credenciales de inicio de sesión.

Así es como puedes hacerlo.

import android.preference.PreferenceManager; 

private static final String LOGIN_EMAIL = "login_email"; 
private static SharedPreferences mAppPreferences; 
private static SharedPreferences.Editor mEditor; 

/*Insert your code to Get user entry of email from the EditText*/ 

mAppPreferences = PreferenceManager.getDefaultSharedPreferences(context); 
mEditor = mAppPreferences.edit(); 
mEditor.putString(LOGIN_EMAIL, v_user_email); 
mEditor.commit(); 

No creo que el almacenamiento SharedPreference sea inseguro o pueda ser manipulado.

+1

Lo curioso es que si utiliza algo como ACRA para hacer el registro de excepciones para usted, se eliminarán todas las preferencias compartidas de los usuarios en el momento del bloqueo, por lo que la contraseña quedará expuesta allí mismo ... interesante. – topwik

+0

@towpse puede descargar todo lo que desee, pero nunca puede usar esa contraseña para iniciar sesión en la aplicación. – Aakash

+2

que depende de la aplicación ¿no es así? – topwik

1

¿Tiene algún control del lado del servidor, o es este un cliente de correo electrónico genérico? Si puedes controlar el lado del servidor, yo haría algo como autenticar, luego haré que el servidor genere un UUID y lo mantendré localmente para futuras llamadas de API. Otra idea sería enviar un hash de la contraseña a las llamadas de API en lugar de la contraseña real, luego puede almacenar solo el hash de contraseña localmente.

El problema al cifrar el nombre de usuario/contraseña es que su código debe ser capaz de descifrarlo, y si su código puede descifrarlo, alguien puede aplicar ingeniería inversa a su código y hacerlo también, aunque puede hacerlo más fácil/más difícil por la forma en que lo codifica y lo empaqueta.

Una vez que averigüe QUÉ está almacenando, puede averiguar cómo lo almacena. ¿Una cuenta? Preferencias compartidas. ¿Multiples cuentas? Crea un DB Sqlite.

Sugeriría usar http://ormlite.com/ para manejar sus conexiones de db. Hice una buena parte del trabajo inicial de puerto de Android, y ahora ha sido mejorado/mantenido por un grupo de hackers de primera clase. Cosas muy sólidas

Ver más entradas de blog Sqlite:

http://www.touchlab.co/blog/single-sqlite-connection/ http://www.touchlab.co/blog/android-sqlite-locking/

1

Si la seguridad es una preocupación, con el tiempo que todavía se reduce a guardando las credenciales del usuario en forma encriptada. Aquí hay algunas sugerencias:

  1. Considere encriptar las credenciales con Base64.

  2. La clave de cifrado debe dividirse en diferentes partes y guardarse en diferentes partes de la aplicación. Solo para ser combinado por la lógica de la aplicación.

  3. Considere usar JNI para cifrar parte del código.

  4. Una vez que tenga una lógica de encriptación en su lugar, debe usar AbstractAccountAuthenticator.

Recuerda dos cosas: a. Un apk se puede descompilar para recuperar la clave. (Es por eso que (2) y (3)). b. Guardar texto sin formato es desastroso. (Es por eso que (1)).

Pensándolo bien, una vez que tenga 1, 2 y 3 en su lugar, puede usar las Preferencias Compartidas también.

Cuestiones relacionadas