Si vous développez une application qui doit gérer les mots de passe, il est important de bien le faire, sous peine de risquer le piratage de votre système et la compromition des données de vos utilsateurs.
Il existe de bonnes pratiques pour stocker un mot de passe.
La bonne manière de stocker
Stockez le
login et
hash(login+salt+motdepasse)
Pseudo-code: passwordHash = MD5( login + "zo5pro$1pvkhj6*cz4a8ùtvb#ui4oeuio" + motdepasse )
Stockez
login et
passwordHash. Ne stockez
pas motdepasse.
Pourquoi un hash ?
Il ne faut jamais stocker le mot de passe en clair.
Risque: Si quelqu'un s'introduit dans votre base de mots de passe, il pourrait les récupérer directement et les utiliser.
Protection: Le hash permet de calculer une
empreinte du mot de passe. Comme l'algorithme n'est
pas réversible, on ne peut pas retrouver immédiatement le mot de passe à partir du hash.
C'est pour cela qu'on utilise un hash cryptographique. Typiquement MD5, SHA-1 ou autre (SHA-256, SHA-512...)
Ne jamais utiliser de CRC ou CRC32.
Pourquoi un salt ?
Les rainbow-tables sont de grosses tables contenant des hash (MD5 et autres) précalculées.
Cela permet de retrouver très rapidement le mot de passe qui a donné un hash précis.
Risque: Si vous utilisez juste MD5(motdepasse), les rainbow-tables permettent de retrouver le mot de passe correspondant au MD5 en quelques minutes, voire quelques secondes.
Protection: En utilisant un salt, cela rend les rainbow-tables totalement inutiles.
Le salt est une valeur arbitraire, de la longueur de votre choix. Définissez-la comme une constante dans votre application.
Pourquoi ajouter le login ?
Si vous stockez juste MD5(salt+motdepasse) ou MD5(motdepasse), cela veut dire que deux utilisateurs ayant le même mot de passe auront le même hash.
Risque: On peut repérer très facilement les utilisateurs ayant le même mot de passe. Si un utilisateur est compromis, cela permet d'accéder immédiatement à d'autres utilisateurs (qui ont peut-être des droits supérieurs).
Protection: En ajoutant le login avant de hasher, la MD5 résultante sera différente pour chaque utilisateur, même s'ils ont le même mot de passe.
Vérification
Lorsque vous recevez login et mot de passe, il vous suffit de refaire le même calcul:
- Rechercher dans votre base le hash correspondant à ce login
- Comparer la valeur avec hash(login+salt+motdepasse)
- Si les deux hash sont identiques, le mot de passe entré est correct.