ELEPHANT technologies, l’ESN locale et à taille humaine spécialisée sur 2 métiers : le développement et le pilotage autour de 4 expertises : embedded & ioT, digital & agile.

 

Aujourd’hui, retrouvez Sammy notre elephantgénieur fullstack logiciel et mobile, qui nous explique comment stocker un mot de passe dans une application Android.

 

Let’s go !

 

 

Stocker un mot de passe dans

une appli Android

Partie 1

 

 

Faisons ensemble un petit tour d’horizon des bonnes pratiques lorsque l’on s’attaque à la gestion d’un mot de passe dans son application Android.

 

Tout d’abord, la règle de base est de ne jamais stocker un mot de passe en clair. Nous sommes tous d’accord sur ce point.

 

En lisant un peu sur le sujet, Sammy se rend compte que l’objet String n’est pas vraiment notre ami car il y a un risque de le récupérer en dumpant la heap.

 

Source

 

 

Stocker un hash

 

Le mieux est de ne pas stocker le mot de passe en local sur le device. Cependant, si le besoin apparaît nous pouvons commencer par stocker le hash SHA-256 du mot de passe pour ensuite stocker le hash généré.

 

Voici un exemple :

val message: ByteArray = ...

val md = MessageDigest.getInstance("SHA-256")

val digest: ByteArray = md.digest(message)

 

Pour vérifier que le mot de passe est correct, il nous suffit de faire la même opération avec le mot de passe proposé. Si celui-ci correspond exactement au hash stocké alors le mot de passe est correct.

 

Source 

 

 

 

Saler son hash

 

Certains mettent en avant le fait que le hash SHA-256 seul risque d’exister au sein d’une liste précompilée de hash alias Rainbow table.

La contre-mesure est simple, il suffit de rajouter un salt qui n’a pas besoin d’être caché du reste du monde ce qui va nous permettre de le stocker avec notre hash.

 

import java.security.MessageDigest

import java.security.SecureRandom

val message: ByteArray = ...

val md = MessageDigest.getInstance("SHA-256")

val salt = ByteArray(16)

SecureRandom().nextBytes(salt)

val digest: ByteArray = md.digest(message + salt)

 

Il nous faut alors stocker le hash généré et le salt que l’on utilisera ensuite pour générer le hash du mot de passe à vérifier.

 

Source 

 

 

Vérification

 

val message: ByteArray = ...

val salt: ByteArray = ... // Le salt précédemment stocké

val hash: ByteArray = ... // Le hash précédemment stocké

val md = MessageDigest.getInstance("SHA-256")

val digest: ByteArray = md.digest(message + salt)

if (String(hash) == String(digest)) println("OK") else println("NOT OK")

 

 

 

On espère que cette introduction aux bonnes pratiques actuelles, pour vérifier le mot de passe sur le device, vous sera utile dans vos futurs développements. Une deuxième partie vous attend afin de stocker le mot de passe de manière à pouvoir le retrouver en clair plus tard.

 


🐘 Nous remercions Sammy pour son article et si vous souhaitez décvourir d’autres articles techniques : c'est par ici !