Dans cet article, je souhaite vous parler de chiffrement de mot de passe. Je vais aussi vous parler de l’algorithme MD5 qui est aujourd’hui encore très utilisé, malgré les risques que cela entraîne. Finalement, je vous donnerai des solutions pour mieux sécuriser vos informations.
En tant que développeur, il nous arrive souvent d’avoir besoin de stocker des informations sensibles du type mot de passe, données de paiement. Ces informations sont généralement stockées en base de données ou bien dans des fichiers.
Très souvent, on va donc mettre en place un chiffrement rapide histoire d’être tranquille pour éviter que l’on puisse lire le contenu trop simplement.
Pour les mots de passe, la technique actuelle est de stocker un hash. C’est donc un chiffrement irréversible. C’est aussi pour ça qu’on ne peut pas retrouver votre mot de passe. La quasi-totalité des services web vous proposeront de générer un nouveau mot de passe.
L’utilisation d’un hash (ou hachage) implique qu’il peut y avoir plusieurs mots de passe avec le même hachage. Ceci n’est généralement pas un problème.
L’algorithme le plus utilisé est MD5 (qui, à l’origine, a été prévu pour calculer un hash d’un message ou d’un fichier).
Le vrai problème provient des attaques du type brute-force ou bien par dictionnaire « inverse ».
Les attaques du type « brute force »
Il y a deux types d’attaques brute-force.
La première consiste simplement à générer des mots de passe avec une boucle. On écrit un morceau de code qui va appeler la page de login avec les mots de passe.
A chaque essai en échec, un change une lettre. C’est simple, mais en général pas très efficace et souvent très long.
La seconde méthode consiste a essayer de récupérer la base de données (ou à y avoir accès) pour récupérer le hash du mot de passe.
Une fois que vous avez ce hash, vous pouvez alors lancer des calculs sur votre machine (ou dans le cloud) pour générer des mots de passe et calculer le hash. Si le hash correspond, alors le mot de passe est valide. La méthode est simple.
Les attaques par dictionnaire « inverse »
MD5 est un algorithme rapide. Ceci permet de calculer des millions de hash pour des mots générés. Ces hashs pourront être stockés dans un dictionnaire.
Ceci permettra donc, à partir d’un hash, de récupérer un mot de passe valide pour se connecter.
C’est là le problème de MD5.
Comment trouver un mot de passe à partir d’un MD5 ?
Aujourd’hui, il est très facile de trouver un mot de passe valide à partir d’un MD5.
Le site CrackStation permet de faire ça très simplement.
Voici un exemple pour le mot de passe « azerty » :
- MD5 : 5f4dcc3b5aa765d61d8327deb882cf99
- Mot de passe trouvé par CrackStation : azerty.
MD5 : Mais pour quoi faire alors ?
MD5 a été prévu, à l’origine, pour créer des hashs de messages ou de fichiers, afin d’en vérifier l’intégrité. Il doit donc être utilisé pour ça.
L’utiliser autrement est un risque, car l’algorithme est très rapide (ce qui permet donc aujourd’hui de générer des milliers de hash rapidement).
Pour chiffrer des mots de passe, il est possible d’utiliser d’autres algorithmes.
Je vous conseille d’utiliser PBKDF2, bcrypt ou bien scrypt.
Le premier algorithme est très bien implémenté dans .NET. La doc des MSDN donne même un exemple que l’on peut utiliser pour chiffrer : voir l’exemple sur les MSDN.
Dans tous les cas, je vous conseille fortement de modifier votre habitude concernant MD5.
La puissance de calcul évolue très rapidement et je pense que l’algorithme sera très prochainement « interdit » d’utilisation pour ce type d’information.
Et vous, quels sont les algorithmes que vous utilisez ?