La meilleure option pour stocker le nom d'utilisateur et le mot de passe dans l'application android

je développe une application où l'utilisateur doit se connecter à effectuer des opérations...mais la plupart du temps sur android combiné ppl utilisation de "maintenir la connexion"...et dans ce cas, je devrai maintenir la valeur du nom d'utilisateur et du mot de passe dans mon application..devrais-je utiliser les préférences, ou SQLite Db ou y a-t-il autre chose et comment puis-je le sécuriser? Plz Help... Merci à l'avance..

28
demandé sur Saurabh Agrawal 2012-02-10 22:44:46

6 réponses

Oui, c'est délicat sur Android. Vous ne voulez pas stocker le mot de passe en clair dans les préférences, parce que n'importe qui avec un appareil enraciné sera essentiellement afficher leur mot de passe au monde. De l'autre côté, vous ne pouvez pas utiliser un mot de passe crypté, parce que vous auriez à stocker votre clé de cryptage/déchiffrement quelque part sur l'appareil, encore une fois susceptible à l'attaque de la racine.

une solution que j'ai utilisée il y a quelque temps est de faire générer par le serveur un "ticket" qu'il renvoie à la dispositif, qui est bon pour une certaine période de temps. Ce ticket est utilisé par l'appareil pour toute communication, en utilisant SSL bien sûr pour que les gens ne puissent pas voler votre ticket. De cette façon, l'utilisateur s'authentifie leur mot de passe sur le serveur, le serveur renvoie une expirant billet, et le mot de passe n'est jamais stocké sur l'appareil.

plusieurs mécanismes d'authentification à trois jambes, comme OpenID, Facebook, même Google APIs, utilisent ce mécanisme. Les inconvénients sont que chaque fois dans un tandis que, lorsque le ticket expire, l'utilisateur doit se reconnecter.

en fin de compte, cela dépend de la sécurité de votre application. Si c'est simplement pour distinguer les utilisateurs, et qu'aucune information super-secrète n'est stockée comme les comptes bancaires ou les groupes sanguins, alors peut-être que sauvegarder le pwd en clair sur l'appareil est très bien :)

bonne chance, quelle que soit la méthode que vous jugez la meilleure pour votre situation particulière!

Modifier: je dois noter que cette technique transfert de la responsabilité de la sécurité sur le serveur - vous voudrez utiliser des hachages salés pour la comparaison de mot de passe sur le serveur, une idée que vous verrez dans certains des autres commentaires pour cette question. Cela empêche le mot de passe en clair d'apparaître n'importe où sauf la vue EditText sur le périphérique, la communication SSL au serveur, et la RAM du serveur pendant qu'il salit et hache le mot de passe. Il n'est jamais stocké sur disque, ce qui est une bonne chose(tm).

26
répondu Mike 2012-02-10 22:32:12

comme d'autres l'ont dit, il n'existe aucun moyen sécurisé de stocker un mot de passe dans Android qui protège les données pleinement. Hasher/crypter le mot de passe est une excellente idée mais tout ce qu'il fera est de ralentir le "cracker".

cela dit, c'est ce que j'ai fait:

1) j'ai utilisé ceci simplecryto.java classe qui prend une graine et d'un texte et la crypte. 2) j'ai utilisé SharedPreferences en mode privé qui protège le fichier sauvegardé dans les périphériques non-enracinés. 3) la graine que j'ai utilisée pour simplecryto est un tableau d'octets qui est un peu plus difficile à trouver par la décompilation qu'une Chaîne de caractères.

ma demande a été récemment examinée par un groupe de sécurité" chapeau blanc " embauché par mon entreprise. Ils ont signalé ce problème, et ont indiqué que je devrais utiliser OAUTH, mais ils ont aussi indiqué que c'était un problème à faible risque, ce qui signifie que ce n'est pas génial, mais pas assez mauvais pour empêcher la libération.

rappelez-vous que le "cracker" aurait besoin d'avoir un accès physique à l'appareil et de l'enraciner et de soins assez pour trouver la graine.

Si vous vous souciez vraiment de la sécurité, n'ont pas de "rester connecté".

23
répondu knaak 2015-01-23 09:28:47

au minimum, stockez-le dans SharedPreferences (mode privé) et n'oubliez pas de hash le mot de passe. Bien que cela ne fasse pas vraiment une différence avec un utilisateur malveillant (ou un périphérique enraciné), c'est quelque chose.

5
répondu Marvin Pinto 2012-02-10 18:50:19

la façon la plus sûre de le faire sans compromettre la sécurité est d'utiliser les préférences partagées pour stocker seulement le nom d'utilisateur de la dernière personne à se connecter.

aussi, dans votre tableau d'utilisateurs, introduisez une colonne qui tient booléen numérique (1 ou 0) pour représenter si la personne a coché la personne a coché la case "Se souvenir de moi" ou non.

lors du lancement de votre application, Obtenez le nom d'utilisateur en utilisant le getSharedPreferences() fonction et l'utiliser pour interroger votre base de données hébergée pour voir si le la colonne signedin est soit 1 ou 0 , où 1 indique que la personne a coché la case "remember me".

1
répondu Gideon Kyalo 2012-10-03 20:14:14
 //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();
            }
1
répondu Mani Kandan 2016-09-01 11:31:04

L'utilisation de NDK pour le chiffrement et le déchiffrement ainsi que la définition de la variable clé de chaîne de caractères au lieu de la sauvegarder dans les préférences partagées ou de la définir dans la chaîne de caractères xml aiderait à empêcher le vol de clé secrète contre la plupart des kiddies de script. Le texte codé résultant serait alors stocké dans les préférences partagées. ce lien peut aider sur le code d'exemple

0
répondu Irfan Ul Haq 2018-03-05 13:09:50