Le meilleur moyen pour une implémentation «mot de passe oublié»? [fermé]

154

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

Je viens avec 2 idées:

  1. Lorsque l'utilisateur clique sur le mot de passe oublié, l'utilisateur doit saisir le nom d'utilisateur, l'e-mail et peut-être la date de naissance ou le nom de famille. Ensuite, un e-mail 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. Similaire, mais l'e-mail contiendrait un lien permettant à l'utilisateur de réinitialiser son mot de passe.

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

Zaki
la source
J'ai re-taggé le message car cela va au-delà de JSF - vous obtiendrez probablement plus de réponses de cette façon.
McDowell
6
@Whoever Il y a une vague de "supprimons cette question fermée parce que XYZ" sur meta ces mois-ci. Je voudrais simplement dire que cette question particulière ne devrait pas être supprimée, à moins qu'il ne soit prouvé que les solutions sont imparfaites et que son existence nuit littéralement plus qu'elle ne contribue à la sécurité.
Félix Gagnon-Grenier
1
OWASP " aide
mémoire
Le lien suggéré par @megaflop est maintenant malheureusement rompu, voici le nouveau lien: cheatsheetseries.owasp.org/cheatsheets
Marco Bolis

Réponses:

187

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 au lieu du nom d'utilisateur, car les noms d'utilisateur sont parfois également oubliés.
  2. Le système a une table password_change_requestsavec les colonnes ID, Timeet UserID. Lorsque le nouvel utilisateur appuie sur le bouton, un enregistrement est créé dans la table. La Timecolonne contient l'heure à laquelle l'utilisateur a appuyé sur le bouton «Mot de passe oublié». Le IDest une chaîne. Une longue chaîne aléatoire est créée (par exemple, un GUID), puis hachée comme un mot de passe (qui est un sujet distinct en soi). Ce hachage est ensuite utilisé comme «ID» dans le tableau.
  3. Le système envoie un e-mail à l'utilisateur qui contient un lien. Le lien contient également la chaîne d'ID d'origine (avant le hachage). Le lien sera quelque chose comme ceci: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. La page Forgotpassword.jsp devrait pouvoir récupérer le paramètre ID. Désolé, je ne connais pas Java, donc je ne peux pas être plus précis.
  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 IDde l'URL, le hache à nouveau et vérifie par rapport à la table. Si un tel enregistrement existe et n'a pas plus de, disons, 24 heures, l'utilisateur est invité à entrer un nouveau mot de passe .
  5. L'utilisateur entre un nouveau mot de passe, clique sur OK et tout le monde vit heureux pour toujours ... jusqu'à la prochaine fois!
Vilx-
la source
1
la manière la plus appropriée d'implémenter cela serait - envoyer le jeton temporaire de réinitialisation de mot de passe sous forme d'e-mail en texte brut à l'utilisateur (mais ne jamais le stocker en texte brut dans la base de données) - après que l'utilisateur entre dans cette température, le forcer immédiatement à ressaisissez un nouveau mot de passe. - pour les paranoïaques, assurez-vous que votre serveur smtp a ssl, afin que vos mails contenant des informations sensibles ne soient pas espionnés. dans la plupart des cas, cette approche est assez sûre. si votre cas nécessite plus de sécurité, vous ne devriez probablement pas avoir d'utilisateurs qui oublient leurs mots de passe: S
Kaushik Gopal
6
Pourquoi générer une chaîne / GUID aléatoire, la hacher et utiliser le hachage? Le guide ne suffit-il pas?
Jeroen K
15
@jeroenk - Ainsi, si quelqu'un vole votre base de données, il ne peut pas forger un lien "Réinitialiser le mot de passe" et changer le mot de passe de quelqu'un.
Vilx-
4
c'est essentiellement la manière décrite pour réinitialiser correctement un mot de passe crackstation.net/hashing-security.htm#faq
TruthOf42
1
@David - Ach, je voulais éditer le message, mais le sujet est verrouillé. :( OK, nous allons essayer de nouveau: votre table contiendra les colonnes: ID, UserID, Time, TokenHash.. Vous allez générer deux longues chaînes aléatoires Placez la première chaîne (le « id ») dans la IDcolonne, hachage du second (le « jeton » ) et mettez le hachage dans la TokenHashcolonne. Le générer le lien comme forogotPassword.jsp?id=asdasd&token=asdasd. Le jeton dans le lien n'est PAS haché. Cela a-t-il un sens maintenant?
Vilx-
28

Tout dépend de votre site et du niveau de sécurité que vous essayez d'atteindre, mais le processus de base d'une application Web se déroule comme suit:

  1. L'utilisateur accède à la page «J'ai oublié mon mot de passe» et entre son nom d'utilisateur ou son adresse e-mail (selon l'un des deux) pour demander une réinitialisation de mot de passe.

  2. En option, à ce stade, vous pouvez confirmer la demande en demandant des informations supplémentaires telles que la réponse à une question de sécurité prédéfinie ou leur date de naissance, etc. Ce niveau supplémentaire empêche les utilisateurs de recevoir des e-mails 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 e-mail à 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 accède à 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 un délai spécifié (par exemple 1 heure) de l'horodatage enregistré à l'étape 2, hachez et enregistrez le nouveau mot de passe. (Evidemment seulement si les mots de passe temporaires correspondent!). Supprimez le GUID et l'horodatage temporaires.

Le principal ici est que l'utilisateur reçoit par courrier électronique un mot de passe temporaire qui lui permet de changer son mot de passe. Le mot de passe stocké à l'origine (il devrait être haché!) N'est jamais changé en 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.

Notez que 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. Cela suffit généralement pour la plupart des sites / applications.

David Glenn
la source
24

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 de mot de passe sécurisée . Les extraits les plus pertinents sont:

[T] voici deux approches courantes:

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

Malgré de nombreuses indications contraires, le premier point n'est vraiment pas là où nous voulons être. Le problème avec cela est que cela signifie qu'un mot de passe persistant - un mot de passe avec lequel vous pouvez revenir en arrière et l'utiliser à tout moment - a maintenant été envoyé sur un canal non sécurisé et réside dans votre boîte de réception.

...

Mais il y a un autre gros problème avec la première approche en ce sens qu'elle rend le verrouillage malveillant d'un compte extrêmement simple. Si je connais l'adresse e-mail d'une personne qui possède un compte sur un site Web, je peux la verrouiller à tout moment en réinitialisant simplement 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 quelque chose qui ne devrait se produire qu'après avoir vérifié avec succès le droit du demandeur de le faire.

Lorsque nous parlons d'une URL de réinitialisation, nous parlons d'une adresse de site Web qui est unique à 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 e-mail dans le cadre de l'URL de réinitialisation, puis associé à 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 à ce sujet dans un instant). Lorsque l'e-mail est envoyé, il contient une URL telle que «Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b» et lorsque l'utilisateur charge cela, la page vérifie l'existence du jeton et confirme par conséquent l'identité de l'utilisateur et autorise le mot de passe à être changé.

...

L'autre chose que nous voulons faire avec une URL de réinitialisation est de limiter le temps du jeton afin que le processus de réinitialisation doive être terminé dans une certaine durée, par exemple dans une heure.

...

Enfin, nous voulons nous assurer qu'il s'agit d'un processus unique. 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, cela permet de garantir qu'un attaquant dispose d'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 fait beaucoup plus de bons points pour éviter les fuites d'informations, les CAPTCHA, l'authentification à deux facteurs et bien sûr les meilleures pratiques de base comme le hachage de mot 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 but 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 demander au site de vous envoyer votre mot de passe actuel par e-mail. 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 terrible pour la sécurité. La réponse à la question secrète est beaucoup plus facile à deviner qu'un bon mot de passe, et l'information est beaucoup plus publique.

Dave Liepmann
la source
1
Ce lien contient des images NSFW claires, il existe un lien pour changer cela, mais beaucoup de gens numérisent une page en premier. Idée stupide!
nik0lai
Le lien vers l'article de Troy Hunt a changé. Aller à troyhunt.com/everything-you-ever-wanted-to-know
knarfancho
@knarfancho Fixé, merci!
Dave Liepmann
15

J'irai avec:

  1. Demander un e-mail à l'utilisateur, vérifier que l'e-mail est enregistré
  2. Générez le GUID et envoyez-le à cet e-mail
  3. Ne réinitialisez pas encore le mot de passe
  4. L'utilisateur clique sur le lien, puis doit entrer un nouveau pass
  5. Ne réinitialisez le mot de passe qu'une fois que l'utilisateur est sur votre site et qu'il a cliqué sur le bouton de réinitialisation après avoir tapé un nouveau mot de passe.
  6. Rendez ce GUID expirable dans un court laps de temps pour le rendre plus sûr.
andres.santana
la source
Je ne veux pas avoir d'ennuis en demandant un? mais c'est lié à votre réponse. Comment générez-vous le GUID?
KingAndrew
2
-1 pour ne pas implémenter une sorte de hachage sur le lien que vous envoyez à la personne
TruthOf42
11

Lorsque vous envoyez des informations par e-mail, elles ne seront pas sécurisées. Il y a trop de façons de l'obtenir. Ce serait un jeu d'enfant pour un hacker expérimenté cherchant à voler vos informations.

Abstenez-vous d'envoyer des informations personnelles telles que des mots de passe et des informations sur les revenus par e-mail car cela peut devenir TRÈS EMBARRASSANT pour vous et votre organisation si ces informations ont été divulguées ou volées. Pensez sérieusement à la sécurité. Il suffit d'un seul incident pour que toutes les briques tombent.

En ce qui concerne la récupération de mot de passe, lisez attentivement les meilleures pratiques relatives aux mots de passe oubliés .

L'essentiel est qu'une application suivant les meilleures pratiques devrait permettre à un utilisateur de réinitialiser son propre mot de passe. Des questions de sécurité personnelles doivent être utilisées. L'application ne doit pas envoyer d'e-mails, afficher les mots de passe, ni définir de mots de passe temporaires.

EDIT: lien mis à jour

jinsungy
la source
J'ai essayé le lien pour les meilleures pratiques de mot de passe oublié et j'ai obtenu une erreur de serveur 500. Pensez-vous que le serveur est en panne maintenant ou y a-t-il un autre lien à suivre?
KingAndrew
le lien est de nouveau mort.
Eric Cope
7

Comme dit, cela dépend du niveau de sécurité requis, cependant, si vous avez besoin d'un niveau plus élevé, certaines solutions nouvelles que j'ai vues incluent;

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

  • Confirmation de l'identité par e-mail et sur 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, implémenter des questions de sécurité peut être la voie à suivre, comme mentionné par DaveG.

Tom Werner
la source
6

Si vous incluez une adresse e-mail avec l'inscription. Le bouton "Oublier le mot de passe" envoie un e-mail à cette adresse e-mail. Il garantit que les informations sont envoyées à un e-mail de confiance.

(À moins que la base de données ne soit piratée, mais alors rien n'est sûr).

Toon Krijthe
la source
5

Voici trois très bons liens qui fournissent 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 l'utilisation de 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 cela pourra aider. Ils m'ont certainement aidé à comprendre le problème.

KingAndrew
la source
4

J'appliquerais des adresses e-mail uniques à tous les comptes.

Ensuite, il s'agit simplement d'envoyer un lien vers une page temporaire qui permet à la personne de changer son mot de passe. (prévoir 24 heures ou moins)

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

Andrew Harry
la source
2

N'envoyez jamais de 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 du mot de passe oublié, demandez l'adresse e-mail / l'ID utilisateur et un NOUVEAU mot de passe à l'utilisateur.
  2. Envoyez par e-mail un lien vers l'e-mail 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 environ, désactivez le lien (pour qu'il ne change plus le mot de passe).

Ne modifiez jamais le mot de passe sans le consentement de l'utilisateur. Cela signifie ne pas envoyer un nouveau mot de passe par e-mail simplement parce que quelqu'un a cliqué sur le lien du mot de passe oublié et a découvert le nom du compte.

Sucuri
la source
13
Je suis concerné par cette technique. L'attaquant entre votre e-mail et un NOUVEAU mot de passe. Le propriétaire du compte reçoit l'e-mail, a mal lu quelque chose et clique sur le lien. L'attaquant se tient prêt, essayant un nouveau mot de passe toutes les minutes, accède au compte jusqu'à ce que le propriétaire du compte réalise ce qui s'est passé et finit par accéder à la page "Mot de passe oublié".
Odi - Xceed
Un autre problème! fournir un nouveau mot de passe à l'heure de réinitialisation du mot de passe n'est pas une bonne option. Je peux oublier à nouveau le nouveau mot de passe si je vérifie mon e-mail après les heures!
Yazid Erman