programa - La mejor opción para almacenar el nombre de usuario y la contraseña en la aplicación de Android
gestor de contraseñas online (6)
Estoy desarrollando una aplicación en la que el usuario debe iniciar sesión para realizar operaciones ... pero principalmente en el uso de ppl con el teléfono androide android "mantener mi sesión iniciada" ... y en ese caso tendré que mantener el valor de nombre de usuario y contraseña en mi aplicación ... ¿debo usar las preferencias o SQLite Db o hay algo más y cómo puedo hacer que sea seguro? Por favor ayuda ... Gracias de antemano ..
Como han dicho otros, no existe una forma segura de almacenar una contraseña en Android que proteja los datos por completo. Hash / cifrar la contraseña es una gran idea, pero todo lo que hará es ralentizar el "cracker".
Dicho esto, esto es lo que hice:
1) Utilicé esta clase simplecryto.java
que toma una semilla y un texto y la cifra. 2) Utilicé SharedPreferences
en modo privado que protege el archivo guardado en dispositivos no rooteados. 3) La semilla que usé para simplecryto es una matriz de bytes que es un poco más difícil de encontrar por los descompiladores que una cadena.
Mi solicitud fue revisada recientemente por un grupo de seguridad "white hat" contratado por mi empresa. Indicaron este problema e indicaron que debería estar usando OAUTH, pero también lo mencionaron como un problema de BAJO riesgo, lo que significa que no es excelente, pero no lo suficiente como para evitar la liberación.
Recuerde que el "cracker" necesitaría tener acceso físico al dispositivo Y rootearlo Y cuidarlo lo suficiente para encontrar la semilla.
Si realmente te importa la seguridad, no tengas la opción "Mantenerme conectado".
Como mínimo, guárdelo en SharedPreferences
(modo privado) y no olvide escribir la contraseña. Aunque esto realmente no hará una diferencia con un usuario malintencionado (o dispositivo rooteado), es algo.
El uso de NDK para el cifrado y descifrado junto con la definición de la variable String Key en lugar de guardarla en las preferencias compartidas o definirla en la cadena xml ayudaría a evitar el robo de claves secretas contra la mayoría de los niños de script. El texto cifrado resultante se almacenaría en las preferencias compartidas. Este enlace puede ayudar con el código de ejemplo.
La forma más segura de hacer esto sin poner en peligro la seguridad es usar las preferencias compartidas para almacenar SOLAMENTE el nombre de usuario de la última persona en iniciar sesión.
Además, en la tabla de usuarios, introduzca una columna que contenga el valor booleano numérico (1 o 0) para indicar si la persona marcó la casilla marcada "Recordarme" o no.
Cuando getSharedPreferences()
su aplicación, obtenga el nombre de usuario mediante la función getSharedPreferences()
y utilícelo para consultar su base de datos alojada para ver si la columna con signo es 1 o 0, donde 1 indica que la persona marcó la casilla "Recordarme".
Sí, esto es complicado en Android. No desea almacenar la contraseña de texto sin formato en las preferencias, ya que cualquier persona con un dispositivo rooteado básicamente mostrará su contraseña al mundo. Por otro lado, no puede usar una contraseña cifrada, ya que tendría que almacenar su clave de cifrado / descifrado en algún lugar del dispositivo, nuevamente susceptible al ataque de raíz.
Una de las soluciones que utilicé hace un tiempo es que el servidor genere un "ticket" que pasa al dispositivo, lo cual es válido durante un cierto período de tiempo. Este boleto es usado por el dispositivo para todas las comunicaciones, usando SSL, por supuesto, para que las personas no puedan robar su boleto. De esta manera, el usuario autentica su contraseña en el servidor una vez, el servidor envía un ticket caducado y la contraseña nunca se almacena en ningún lugar del dispositivo.
Varios mecanismos de autenticación de tres patas, como OpenID, Facebook, incluso las API de Google, utilizan este mecanismo. Las desventajas son que de vez en cuando, cuando el ticket expira, el usuario debe volver a iniciar sesión.
En última instancia, depende de qué tan segura quiera que sea su aplicación. Si esto es simplemente para distinguir a los usuarios, y no se almacena información súper secreta como cuentas bancarias o tipos de sangre, entonces tal vez guardar el pwd en texto sin formato en el dispositivo está bien :)
¡Buena suerte, cualquiera que sea el método que usted elija es el mejor para su situación particular!
Editar: Debo tener en cuenta que esta técnica transfiere la responsabilidad de la seguridad al servidor. Querrá usar hashes salados para la comparación de contraseñas en el servidor, una idea que verá en algunos de los otros comentarios para esta pregunta. Esto evita que la contraseña de texto sin formato aparezca en cualquier lugar, excepto la Vista de texto de edición en el dispositivo, la comunicación SSL con el servidor y la memoria RAM del servidor, mientras que elimina la contraseña. Nunca se almacena en el disco, que es una buena cosa (tm).
//encode password
pass_word_et = (EditText) v.findViewById(R.id.password_et);
String pwd = pass_word_et.getText().toString();
byte[] data = new byte[0];
try {
data = pwd.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String base64 = Base64.encodeToString(data, Base64.DEFAULT);
hbha_pref_helper.saveStringValue("pass_word", base64);
//decode password
String base64=hbha_pref_helper.getStringValue("pass_word");
byte[] data = Base64.decode(base64, Base64.DEFAULT);
String decrypt_pwd="";
try {
decrypt_pwd = new String(data, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}