[Android] Guardar parametros privados

xCoNDoR

Hola devs, hace bastante que no toco programación en Android y no estoy muy al día.

¿ Cual es la mejor forma de guardar preferencias privadas de mi aplicación ? Antiguamente tiraba de base de datos, pero eso es una locura. ¿Que me recomendáis, sobre qué tengo que indagar en google?

Querría guardar datos de acceso, parametros de configuración de la aplicación, etc..

Saludos.

HeXaN

No sé si algo de lo que se trata aquí te serviría: http://www.mediavida.com/foro/9/duda-aplicacion-android-449997

1 respuesta
xCoNDoR

#2 Gracias, no recordaba ese thread. Sobre los SharedPreferences, son seguras ? Si almaceno claves serán visibles abriendo un archivito ?

3 respuestas
HeXaN

#3 No tengo ni la más remota idea, simplemente me acordaba del tema xD

MTX_Anubis

#3 eso te ocurrira las guardes donde las guardes con rootear el movil. Si quieres guardar passwords, no lo hagas nunca (ya no por android, es que no deberías hacerlo).

Y quitando eso pues las SharedPreferences en modo privado no pueden accederse desde otras aplicaciones.

C

#3, como te han comentado ya, de seguras tienen poco:

http://www.androiddiscuss.com/1-android-discuss/1671.html

Se guardan en un .xml y podrían ser accesibles. De todas formas, si la pass la guardas en md5, por ejemplo, ya estás añadiendo algo más de seguridad. Te lo digo porque estoy con un proyecto de la empresa (interno) por mi cuenta en el que almaceno el típico usuario y pass. La pass la almaceno en la base de datos MySQL en md5. Cuando me ponen la pass y es correcta (y han marcado el check de guardar sesión), la codifico a md5 y la guardo en las SharedPreferences.

				SharedPreferences preferencias = getSharedPreferences("ejem_ejem",Context.MODE_PRIVATE);
				SharedPreferences.Editor editor = preferencias.edit();

			if (chkGuardar.isChecked()) {
				editor.putString("email", email);
				editor.putString("pass", pass);
				editor.commit();
			}
			else
			{
				editor.clear();
				editor.commit();
			}

Función encriptación:

	public final String md5(final String s) {
	    try {
	        // Create MD5 Hash
	        MessageDigest digest = java.security.MessageDigest
	                .getInstance("MD5");
	        digest.update(s.getBytes());
	        byte messageDigest[] = digest.digest();
	 
        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        for (int i = 0; i < messageDigest.length; i++) {
            String h = Integer.toHexString(0xFF & messageDigest[i]);
            while (h.length() < 2)
                h = "0" + h;
            hexString.append(h);
        }
        return hexString.toString();
 
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}
1 1 respuesta
xCoNDoR

#6 Gracias por la respuesta :)

En principio lo hemos implementado de la siguiente forma:

Cuando el usuario hace login, el servidor me devuelve un token único y personal que lo utilizo en el resto de peticiones al servidor. Entonces guardaré en sharedpreferences este token hasta que el usuario haga logout manualmente.

1 respuesta
MTX_Anubis

#7 Y así es como debe de hacerse =)

De todas formas, mirate las cuentas de Android y todo eso así el token lo gestiona android y no tendrías necesidad de guardarla en ningún sitio y la cosa te quedaría como con las cuentas de facebook, twitter, etc. y si te vas a ajustes/sincronización y cuentas y te aparecerá ahí xD

http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/

Bueno esto es si la app requiere sincronizaciones con servers y demás, así la podrás tener en modo offline también y el user podrá sincronizarla sin necesidad de entrar en ella, etc.

Si va a ser para 4 chorradas pues casi que no merece la pena, sino sí que la merece y bastante. Cuando lo haces te das cuenta de que no hay otra manera mejor de hacerlo.

1 respuesta
xCoNDoR

#8 Suena genial eso que dices, incluso me valdría puesto que la aplicación sincroniza contactos, registro de llamadas, etc.. Pero de momento no voy a complicarme la vida puesto que la aplicación va a ser una "prueba de concepto" y no va a tener salida al público. Eso si, me lo apunto por si en un futuro me planteo hacer la mejora. Thx.

C

Joder! No conocía la gestión de cuentas desde Android.

El manual oficial:

http://developer.android.com/intl/es/training/id-auth/index.html

Aporta un flujograma de cómo tiene que ser la autenticación:

Con lo cual, si no quisieramos complicarnos en programar un servicio para una cuenta propia de nuestra aplicación, siempre podríamos loguernos utilizando twitter, facebook, gmail,etc. (siempre que estén instaladas). Tiene buena pinta.

De todas formas, sigo sin entender algo bien. Imaginemos que hemos cambiado la password de facebook desde web. ¿Cómo sabría el gestor de cuentas que esto ha sucedido? Es que no termino de entender la utilidad de validación offline si resulta que se han cambiado datos en el servidor. No sé...

Usuarios habituales

  • xCoNDoR
  • MTX_Anubis
  • HeXaN