Bonjour,
J'essais de créer une activité de login pour un projet android studio.
Un utilisateur s'identifie avec un non d'utilisateur et un mot de passe.
J'ai créé une base de données SQLite qui contient ces infos. Jusque là tout est facile.
Sauf que coder en clair le mdp dans la BDD, n'est pas optimal coté sécurité et je voulais essayer de crypter le mot de passe avant de le stocker. Et c'est là que les soucis ont commencés XD.
J'ai essayé plusieurs techniques mais je n'en ai réussi aucune :'(. J'ai fini par tomber sur un tuto assez clair qui consiste à exploiter le KeyStore d'android.
L'objectif est donc lors de l'inscription, de créer une clé secrète qui sera stocké dans le Keystore (apparemment assez sûr) et cette clé sera utilisée pour encrypter le mot de passe saisi lors de l'inscription puis utilisée pour encrypter toute tentative de connexion et ainsi comparer les 2 "messages cryptés". Si il est identique => l'utilisateur est loggé, sinon il est rejeté.
Pour cela il faut donc accéder plusieurs fois au Keystore et c'est là que je bloque. Ca me créé toujours des instances différentes de keyStore et donc il est impossible de récupérer la clé qui y est stockée.
Je ne vois vraiment pas d'où peut venir l'erreur (peut-être de la méthode load mais si je lui passe un autre paramètre ça génère une erreur).
Je vous remercie par avance de bien vouloir m'éclairer.
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 private SecretKey genreatePrivateKey() { // Génère la clé secrète KeyGenerator generator = null; try { generator = KeyGenerator.getInstance("AES"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } generator.init(256); SecretKey key = generator.generateKey(); return key; } public void saveKey(SecretKey key) throws CertificateException, NoSuchAlgorithmException, IOException, NoSuchPaddingException, InvalidKeyException, UnrecoverableKeyException { java.security.KeyStore ks = null; try { ks = java.security.KeyStore.getInstance(java.security.KeyStore.getDefaultType()); } catch (KeyStoreException e) { e.printStackTrace(); } ks.load(null); try { ks.setEntry("key1", new KeyStore.SecretKeyEntry(key), null); } catch (KeyStoreException e) { e.printStackTrace(); } FileOutputStream fos = new FileOutputStream("nvxKeyStore"); // Je n'ai absolument pas compris à quoi servait cette partie try { ks.store(fos, null); } catch (KeyStoreException e) { e.printStackTrace(); } } public void recupKey() throws CertificateException, NoSuchAlgorithmException, IOException, NoSuchPaddingException { java.security.KeyStore ks = null; try { ks = java.security.KeyStore.getInstance("nvxKeyStore"); //ks = java.security.KeyStore.getInstance("AndroidKeyStore"); // Est-ce que le ks.store permet d'enregistrer le keystore pour le rouvrir plus tard ? En tout cas, ca ne marche pas... } catch (KeyStoreException e) { e.printStackTrace(); } ks.load(null); // Key imported, obtain a reference to it. SecretKey keyStoreKey = null; try { keyStoreKey = (SecretKey) ks.getKey("key1", null); } catch (KeyStoreException e) { e.printStackTrace(); } catch (UnrecoverableKeyException e) { e.printStackTrace(); } Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); try { cipher.init(Cipher.ENCRYPT_MODE, keyStoreKey); } catch (InvalidKeyException e) { e.printStackTrace(); } }
Je précise que j'ai pas mal "bidouillé" donc le code n'est pas optimal (pas factorisé...). Désolé pour la mise en forme, sans le "petits points, l'indentation sautée toujours.
De plus, lorsque tout est fait dans la même méthode (enregistrement de la clé puis récupération de celle ci), ca marche bien. Le problème vient donc bien du fait que les 2 instances du KeyStore sont différentes.
J'en profite pour demander, est-ce une méthode d'encryptage efficace ou est-ce qu'il y a une autre méthode plus efficace (sans être trop dure à mettre en place ) ?
Je ne comprends pas trop où stocker la clé (ailleurs que dans le KeyStore) qui sert à crypter le mdp. Car si c'est pour stocker la clé dans la BDD, je ne vois absolument pas l'intérêt.
Je vous remercie par avance pour votre aide.
Bonne journée.
Partager