web-dev-qa-db-fra.com

Le meilleur moyen de mettre en œuvre un mot de passe oublié?

Je recherche la meilleure méthode pour implémenter une fonctionnalité de "mot de passe oublié".

Je sors avec 2 idées:

  1. Lorsque l'utilisateur clique sur un mot de passe oublié, l'utilisateur doit saisir son nom d'utilisateur, son email et éventuellement sa date de naissance ou son nom de famille. Ensuite, un courrier avec un mot de passe temporaire sera envoyé au compte de messagerie de l'utilisateur. L'utilisateur utilise le mot de passe temporaire pour se connecter et réinitialise son mot de passe.

  2. Semblable, mais l'e-mail contient un lien permettant à l'utilisateur de réinitialiser son mot de passe.

Ou n'importe qui peut me suggérer un moyen meilleur et sécurisé? Je pense aussi à envoyer le mot de passe temporaire ou le lien, obliger l'utilisateur à réinitialiser le mot de passe dans les 24 heures, sinon le mot de passe temporaire ou le lien ne sera pas utilisable. Comment faire ça?

143
Hoe Chin

Mise à jour: révisée en mai 2013 pour une meilleure approche

  1. L'utilisateur entre son nom d'utilisateur et clique sur "mot de passe oublié". Je recommande également la possibilité de saisir l'adresse e-mail à la place du nom d'utilisateur, car les noms d'utilisateur sont parfois oubliés.
  2. Le système a une table password_change_requests avec les colonnes ID, Time et UserID. Lorsque le nouvel utilisateur appuie sur le bouton, un enregistrement est créé dans la table. La colonne Time contient l'heure à laquelle l'utilisateur a appuyé sur le bouton "Mot de passe oublié". Le ID est une chaîne. Une longue chaîne aléatoire est créée (un GUID, par exemple), puis hachée comme un mot de passe (qui est un sujet distinct en soi). Ce hachage est ensuite utilisé comme "ID" dans la table.
  3. Le système envoie un courrier électronique à l'utilisateur contenant un lien. Le lien contient également la chaîne d’identification originale (avant le hachage). Le lien ressemblera à ceci: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. La page de mot de passe oublié.jsp devrait pouvoir extraire le paramètre ID. Désolé, je ne connais pas Java, je ne peux donc pas être plus spécifique.
  4. Lorsque l'utilisateur clique sur le lien dans l'e-mail, il est déplacé vers votre page. La page récupère le ID de l'URL, le hache à nouveau et le compare à la table. Si un tel enregistrement existe et n’a pas plus de, disons, 24 heures, l’utilisateur s’affiche avec l’invite à entrer un nouveau mot de passe.
  5. L'utilisateur entre un nouveau mot de passe, appuie sur OK et tout le monde vit heureux pour toujours ... jusqu'à la prochaine fois!
174
Vilx-

Tout dépend de votre site et du niveau de sécurité recherché, mais le processus de base d'une application Web est similaire à ce qui suit:

  1. L'utilisateur accède à la page "mot de passe oublié" et entre son nom d'utilisateur ou son adresse électronique (celui qui est unique) pour demander une réinitialisation du mot de passe.

  2. À ce stade, vous pouvez éventuellement confirmer la demande en demandant des informations supplémentaires, telles que la réponse à une question de sécurité prédéfinie, leur date de naissance, etc. Ce niveau supplémentaire empêche les utilisateurs de recevoir des courriers électroniques qu'ils n'ont pas demandés.

  3. Recherchez le compte de l'utilisateur. Enregistrez un mot de passe temporaire (généralement un GUID) et un horodatage par rapport à l'enregistrement du compte. Envoyez un courrier électronique à l'utilisateur contenant le mot de passe temporaire.

  4. L'utilisateur clique sur le lien contenant le mot de passe temporaire et l'identifiant de l'utilisateur dans l'e-mail ou navigue vers la page "mot de passe oublié" et copie/colle le mot de passe temporaire et son identifiant. L'utilisateur entre son nouveau mot de passe et le confirme.

  5. Recherchez l'enregistrement de l'utilisateur et, si l'heure actuelle est dans une limite de temps spécifiée (par exemple, 1 heure) de l'horodatage enregistré à l'étape 2, puis effectuez un hachage et enregistrez le nouveau mot de passe. (Évidemment que si les mots de passe temporaires correspondent!). Supprimez le temporaire GUID et l'horodatage.

Le principe ici est que l'utilisateur reçoit par courrier électronique un mot de passe temporaire lui permettant de changer son mot de passe. Le mot de passe stocké à l'origine (il doit être haché!) N'est jamais remplacé par un mot de passe temporaire au cas où l'utilisateur s'en souviendrait.

Le mot de passe d'origine ne sera jamais affiché à l'utilisateur car il devrait être haché et inconnu.

Note Ce processus repose entièrement sur la sécurité du compte de messagerie de l'utilisateur. Cela dépend donc du niveau de sécurité que vous souhaitez atteindre. C'est généralement suffisant pour la plupart des sites/applications.

27
David Glenn

Troy Hunt souligne d'excellents points dans son article, Tout ce que vous avez toujours voulu savoir sur la création d'une fonction de réinitialisation sécurisée du mot de passe . Les extraits les plus pertinents sont:

[L] a deux approches communes:

  1. Générez un nouveau mot de passe sur le serveur et envoyez-le par courrier électronique
  2. Envoyer une URL unique qui facilitera le processus de réinitialisation

Malgré toutes les indications, le premier point n’est pas ce que nous voulons être. Le problème, c'est que cela signifie qu'un mot de passe persistant - que vous pouvez utiliser en tout temps - peut être utilisé à tout moment - a maintenant été envoyé sur un canal non sécurisé et réside dans votre boîte de réception.

...

Mais il ya un autre gros problème avec la première approche: elle simplifie le verrouillage malveillant d’un compte. Si je connais l'adresse électronique d'une personne qui possède un compte sur un site Web, je peux la verrouiller à tout moment, simplement en réinitialisant son mot de passe; c'est une attaque par déni de service servie sur un plateau d'argent! C'est pourquoi une réinitialisation est une opération qui ne devrait avoir lieu qu'après avoir vérifié le droit du demandeur de le faire.

Lorsque nous parlons d'une URL de réinitialisation, nous parlons d'une adresse de site Web unique pour cette instance spécifique du processus de réinitialisation.

...

Ce que nous voulons faire est de créer un jeton unique qui peut être envoyé dans un courrier électronique dans le cadre de l'URL de réinitialisation, puis reconstitué à un enregistrement sur le serveur à côté du compte de l'utilisateur, confirmant ainsi que le propriétaire du compte de messagerie est bien celui qui tente de réinitialiser le mot de passe. Par exemple, le jeton peut être "3ce7854015cd38c862cb9e14a1ae552b" et est stocké dans une table à côté de l'ID de l'utilisateur effectuant la réinitialisation et de l'heure à laquelle le jeton a été généré (plus d'informations à ce sujet dans un instant). Lorsque l'e-mail est envoyé, il contient une adresse URL telle que "Réinitialiser /? Id = 3ce7854015cd38c862cb9e14a1ae552b" et lorsque l'utilisateur le charge, la page vérifie l'existence du jeton et confirme par conséquent l'identité de l'utilisateur et permet au mot de passe de être changé.

...

L'autre chose que nous souhaitons faire avec une URL de réinitialisation consiste à limiter la durée du jeton afin que le processus de réinitialisation soit terminé dans un certain délai, par exemple dans l'heure.

...

Enfin, nous voulons nous assurer qu’il s’agit d’un processus ponctuel. Une fois le processus de réinitialisation terminé, le jeton doit être supprimé afin que l'URL de réinitialisation ne soit plus fonctionnelle. Comme pour le point précédent, il s'agit de s'assurer qu'un attaquant a une fenêtre très limitée dans laquelle il peut abuser de l'URL de réinitialisation. De plus, bien sûr, le jeton n'est plus nécessaire si le processus de réinitialisation s'est terminé avec succès.

Il soulève de nombreux autres points positifs pour éviter les fuites d’informations, les CAPTCHA, l’authentification à deux facteurs et, bien sûr, les meilleures pratiques de base telles que le hachage des mots de passe. Je pense qu'il est important de noter que je ne suis pas d'accord avec Troy sur l'utilité des questions de sécurité, préférant le scepticisme de Bruce Schneier à l'égard de la pratique :

Le point de toutes ces questions est le même: un mot de passe de sauvegarde. Si vous oubliez votre mot de passe, la question secrète peut vérifier votre identité afin que vous puissiez choisir un autre mot de passe ou que le site vous envoie votre mot de passe par courrier électronique. C'est une excellente idée du point de vue du service client: un utilisateur est moins susceptible d'oublier le nom de son premier animal qu'un mot de passe aléatoire, mais il est dangereux pour la sécurité. La réponse à la question secrète est beaucoup plus facile à deviner qu’un bon mot de passe et les informations sont beaucoup plus publiques.

21
Dave Liepmann

Je vais avec:

  1. Demander à l'utilisateur pour l'email, vérifier l'email est enregistré
  2. Générer le GUID et l'envoyer à cet email
  3. Ne pas réinitialiser le mot de passe pour le moment
  4. L'utilisateur clique sur le lien, puis doit entrer un nouveau laissez-passer
  5. Réinitialiser le mot de passe uniquement lorsque l'utilisateur est sur votre site et après avoir cliqué sur le bouton de réinitialisation après avoir tapé un nouveau laissez-passer.
  6. Rendre cela GUID expirable dans un court laps de temps pour le rendre plus sûr.
15
andres.santana

Lorsque vous envoyez des informations par courrier électronique, elles ne sont pas sécurisées. Il y a trop de façons dont quelqu'un peut l'obtenir. Ce serait un jeu d'enfant pour un pirate informatique expérimenté cherchant à voler vos informations.

S'abstenir d'envoyer des informations personnelles telles que des mots de passe et des informations sur les revenus par courrier électronique, car elles peuvent devenir TRÈS EMBARRASSANT pour vous et votre organisation si de telles informations étaient divulguées ou volées. Pensez sérieusement à la sécurité. Il suffit d’un incident pour que toutes les briques tombent.

Comme pour la récupération du mot de passe, lisez attentivement Meilleures pratiques pour les mots de passe oubliés.

L'essentiel est qu'une application qui respecte les meilleures pratiques devrait permettre à un utilisateur de réinitialiser son propre mot de passe. Les questions de sécurité personnelle doivent être utilisées. L'application ne doit pas envoyer d'e-mail, afficher de mot de passe, ni définir de mot de passe temporaire.

EDIT: lien mis à jour

11
jinsungy

Comme indiqué, cela dépend du niveau de sécurité requis. Toutefois, si vous avez besoin d’un niveau supérieur, vous trouverez parmi les solutions novatrices que j’ai déjà vues:

  • Afficher la moitié du mot de passe temporaire lorsque l'identité de l'utilisateur a été confirmée (question de sécurité, adresse électronique, etc.), puis l'autre moitié étant envoyée au compte de messagerie. Si le compte de messagerie a été compromis, il est peu probable que la même personne ait également réussi à mener une attaque d'infiltration. (Vu sur UK Goverment Gateway)

  • Confirmation de l’identité par courrier électronique et un autre support - par exemple, un code envoyé par SMS à un mobile enregistré. (Vu sur eBay/Paypal)

Car quelque part entre ces deux extrêmes, la mise en œuvre de questions de sécurité peut être la voie à suivre évoquée par DaveG.

7
Tom Werner

Si vous incluez une adresse e-mail avec l'enregistrement. Le bouton "Mot de passe oublié" envoie un courrier électronique à cette adresse électronique. Cela garantit que les informations sont envoyées à un courrier électronique de confiance.

(Sauf si la base de données est piratée, mais rien n'est sûr).

6
Toon Krijthe

Voici trois très bons liens fournissant des informations sur les réinitialisations de mot de passe:

  1. http://jtauber.com/blog/2006/03/20/account_management_patterns/

  2. (Ne laissez pas les utilisateurs confirmer avec GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15

  3. http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf

J'espère que ça t'as aidé. Ils m'ont certainement aidé à comprendre le problème.

5
KingAndrew

J'appliquerais des adresses électroniques uniques sur tous les comptes.

Ensuite, il suffit d'envoyer un lien vers une page temporaire qui permet à la personne de changer son mot de passe. (permettre 24 heures ou moins)

Le compte de messagerie de l'utilisateur est le lien le plus faible dans ce scénario.

4
Andrew Harry

Ne jamais envoyer un mot de passe à l'utilisateur. Même s'il est généré automatiquement. Meilleure approche (recommandée et utilisée par SANS et d’autres):

  1. Sur la page mot de passe oublié, demandez l'adresse e-mail/ID utilisateur et un nouveau mot de passe de l'utilisateur.
  2. Envoyer un lien vers le courrier électronique stocké pour ce compte avec un lien d'activation.
  3. Lorsque l'utilisateur clique sur ce lien, activez le nouveau mot de passe.

S'il ne clique pas sur le lien dans les 24 heures, désactivez-le (pour qu'il ne change plus le mot de passe).

Ne changez jamais le mot de passe sans le consentement de l'utilisateur. Cela signifie que vous ne devez pas envoyer un nouveau mot de passe par courriel simplement parce que quelqu'un a cliqué sur le lien du mot de passe oublié et a trouvé le nom du compte.

3
Sucuri