Mot de passe des applications web

Hier, en voulant changer le mot de passe qui était associé à mon compte EDF, j'ai eu, une fois de plus, la désagréable surprise de voir qu'ils imposaient une taille minimale et maximale et refusaient certains caractères. Voici l'occasion d'aborder certains points trop souvent mis de côté lors de la conception d'application web.

Laissez moi choisir mon mot de passe

Combien de site vous imposent, par exemple, un mot de passe de 6 à 15 caractères ne contenant que des lettres et des chiffres ? Quand on sait qu'un mot de passe est très rarement stocké en clair dans la base de données du service (si vous stockez vos mots de passe en clair, je vais y revenir), il n'y a strictement aucune raison valable de ne pas me laisser mettre des espaces ou n'importe quel caractère particulier dans mon mot de passe.

Limiter les caractères autorisés dans un mot de passe est tout aussi idiot que refuser les adresses e-mail parfaitement légitimes. Plus grave, c'est une restriction de sécurité pour l'utilisateur.

N'envoyez pas les mots de passe par e-mail

C'est une pratique courante. Quand l'utilisateur a oublié son mot de passe, il peut généralement demander à le récupérer en indiquant son adresse e-mail (et parfois son nom d'utilisateur). Et, trop souvent, un nouveau mot de passe est envoyé à l'utilisateur, dans sa boîte e-mail. Comme de plus en plus de personnes utilisent des fournisseurs d'e-mail tels que Gmail, vous venez de stocker le mot de passe de votre utilisateur ailleurs, en clair.

Permettre à l'utilisateur de retrouver un mot de passe oublié est une bonne chose mais nécessite de réfléchir à comment le faire correctement. La première question à se poser est : quel est le périmètre de sécurité de l'utilisateur ? Dans la plupart des cas, c'est effectivement son adresse e-mail mais ça peut changer. Votre banque, par exemple, vous enverra votre nouveau mot de passe par courrier postal. Pour la banque, votre périmètre de sécurité est votre domicile.

Comment ne pas envoyer le mot de passe par e-mail ? Permettre à l'utilisateur de récupérer son mot de passe d'une manière plus sécurisée est assez simple. Voici un brouillon de ce qui est faisable :

  • L'utilisateur demande à récupérer son mot de passe
  • Il reçoit un lien qui lui permettra d'en créer un nouveau
  • Il créer son nouveau mot de passe et est immédiatement connecté au site

Le lien permettant de créer un nouveau mot de passe peut-être fait à l'aide d'un jeton à durée limitée. Si le jeton est basé sur le mot de passe, le changement de celui-ci rendra le jeton invalide (le lien de réinitialisation sera donc invalide).

Note : je sais que je n'ai pas appliqué ces principes par le passé mais on apprend de ses erreurs :)

Une excellente implémentation de tout ceci est faite dans Django. Décortiquer et comprendre le module django.contrib.auth peut être une très saine occupation un jour de mauvais temps.

Comment stocker un mot de passe ?

Il existe de nombreuses manières de stocker un mot de passe. La première est de ne pas le stocker en clair. Jamais. Si pour une raison parfaitement valable vous avez besoin d'une version lisible du mot de passe, chiffrez-le de manière symétrique. Un chiffrement symétrique nécessite une clé permettant de chiffrer et déchiffrer le mot de passe de l'utilisateur. La clé doit être parfaitement bien gardée. Il existe de nombreux outils pour le faire, Mcrypt en PHP, M2Crypto en Python, un module GPG dans PostgreSQL, etc.

Si vous n'avez pas besoin de la version lisible du mot de passe de l'utilisateur, faites un hash du mot de passe, de préférence avec une clé ou un salt (afin d'éviter d'avoir le même hash pour deux mots de passe identiques).

J'ai pour habitude de stocker des mots de passe en utilisant hmac-sha256 avec une clé composée d'une partie fixe et d'une aléatoire. Dans la plupart des cas, c'est plus que ce dont j'ai besoin. Pour résumer (très mal), HMAC est un système de hachage de message avec une clé.

Et si en 2010 vous arrêtiez de stocker des mots de passe ?

Si votre seule raison de stocker un mot de passe est d'authentifier l'utilisateur, pourquoi ne pas utiliser un système tel que OpenID ou OAuth et faire à vos utilisateur le cadeau d'un service où il n'auront pas à se rappeler d'un énième mot de passe ? Je ne sais pas dans quelle mesure ne plus proposer de formulaire d'enregistrement mais uniquement une authentification décentralisé est possible mais c'est une proposition qui ne peut plus être écartée. Si vous souhaitez en savoir un peu plus sur OpenID et OAuth, Eric Daspet en a très bien parlé à Paris-Web.

Sur ce, je vous souhaite de très bonnes fêtes de fin d'année.

Comments

Félix Aimé 7 years, 10 months ago

Un hash SHA/MD5 etc. n'est pas un chiffrage du type asymétrique, car comme vous l'avez mentionné, on ne peut pas récupérer le mot de passe après l'avoir hashé, on peut juste le comparer.

OAuth et OpenID possèdent eux aussi leurs propres limités liées à la sécurité des applications WEB. Tout d'abord, du fait de la centralisation du système d'authentification ce n'est pas une véritable sécurité pour certains.

De plus, certaines attaques ont été perpétrées contre ces systèmes voir l'article de GNUCITIZEN http://www.gnucitizen.org/blog/openid-a-security-story/ et un article sur la possibilité de backdorrer des comptes Twitter à l'aide de OAuth ( ce système présentait une vulnérabilité dans ses tokens d'authentification il y a quelques mois d'ailleurs) : http://blog.felix-aime.fr/backdoorer-un-compte-twitter/

De plus, les mots de passes sont une simple sécurité supplémentaires mais l'on voit encore des vulnérabilités permettant le vol de session (donc aucune authentification) sur des sites possédant une infrastructure critique pour les données personnelles engagées telles que des webmails, banques, réseaux sociaux etc.

Bref, sinon votre article résume bien ce problème que l'on voit encore partout aujourd'hui...

Olivier 7 years, 10 months ago

Felix, merci pour ces précisions.

Edit: j'ai corrigé le billet, il y avait effectivement une grosse boulette sur le chiffrement :) Je me coucherai un peu moins bête ce soir.

Olivier 7 years, 10 months ago

Felix, merci pour ces précisions.

Edit: j'ai corrigé le billet, il y avait effectivement une grosse boulette sur le chiffrement :) Je me coucherai un peu moins bête ce soir.

Cedric Pernet 7 years, 10 months ago

Personnellement, je recommande Keepass pour stocker tous les mots de passe web. Bon chiffrement, bonne ergonomie, Linux/Windows/Mac, complétion automatique des champs login/pass, générateur de mot de passe très configurable... Un très bon produit :)

Franck 7 years, 10 months ago

Personnellement ce n'est pas le mot de passe qui me pose problème, je m'en souviens toujours. Par contre le login ... :-)

Joyeux noël toussa !

Jc 7 years, 10 months ago

Idem. Keepass est très utile. Génération, stockage et auto-complétion.

Da Scritch 7 years, 9 months ago

Joyeux Noël de retard.

Tu vas me trouver bourrin, mais je génère un mot de passe sur les applications critiques. Ok, je l'envoie en clair par e-mail, mais c'est juste parce que j'ai pas fini de faire mon connecteur SMS.

Sinon, pour vérifier les e-mails, n'oublions pas que PHP propose régulièrement de nouvelles fonctions comme filter_var('bob@example.com',FILTER_VALIDATE_EMAIL) . Faut que je la teste, justement. Merci pour la liste

TulipVorlax 7 years, 9 months ago

C'est bien vrai que beaucoup de sites imposent des restrictions sur les mots de passe qui limitent leur sécurité.

J'utilise moi aussi Keepass. Ainsi, je peux facilement avoir des mots de passe du genre bT6&'o0/_i;nHO2. sur les sites qui autorisent ces caractères. Certains de mes mots de passe contiennent même des caractères qui ne sont pas présent sur mon clavier.

Par contre, moi je crois que je vais interdire les adresses Hotmail lorsque je vais faire des trucs en PHP; j'ai trop d'amis virtuels qui se sont fait pirater leur Hotmail et volé leur comptes de jeu (Guild Wars).

TulipVorlax 7 years, 9 months ago

C'est bien vrai que beaucoup de sites imposent des restrictions sur les mots de passe qui limitent leur sécurité.

J'utilise moi aussi Keepass. Ainsi, je peux facilement avoir des mots de passe du genre bT6&'o0/_i;nHO2. sur les sites qui autorisent ces caractères. Certains de mes mots de passe contiennent même des caractères qui ne sont pas présent sur mon clavier.

Par contre, moi je crois que je vais interdire les adresses Hotmail lorsque je vais faire des trucs en PHP; j'ai trop d'amis virtuels qui se sont fait pirater leur Hotmail et volé leur comptes de jeu (Guild Wars).

Mat 7 years, 9 months ago

pour les adeptes de l'éditeur VI, il existe un plugin sympa qui vous permettra de stocker vos mdp dans un fichier texte: openssl.vim

- http://www.vim.org/scripts/script.php?script_id=2012 - pour la mise en place: http://bit.ly/6nVXCp

J'utilise Keypass au boulot, très très bon soft.