web-dev-qa-db-fra.com

Quelqu'un peut-il fournir des références pour implémenter correctement les mécanismes de réinitialisation automatique des mots de passe des applications Web?

Nous mettons en œuvre la réinitialisation automatique du mot de passe sur une application Web, et je sais comment je veux le faire (URL de réinitialisation du mot de passe limitée dans le temps par e-mail à l'adresse e-mail préenregistrée des utilisateurs).

Mon problème est que je ne trouve aucune référence pour indiquer aux développeurs l'utilisation de cette technique. Quelqu'un peut-il m'orienter vers de bonnes références sur cette technique?

96
bdg

Quelques suggestions:

Ne réinitialisez pas le mot de passe de l'utilisateur avant confirmation. Ne réinitialisez pas immédiatement le mot de passe de l'utilisateur. Réinitialisez-le uniquement lorsque l'utilisateur clique sur un lien de confirmation envoyé à son adresse e-mail préenregistrée.

Nécessite un CAPTCHA. Lorsqu'un utilisateur demande que son mot de passe soit réinitialisé, forcez-le à résoudre un CAPTCHA avant de poursuivre. Il s'agit d'empêcher les outils automatisés d'essayer de causer de la peine à de nombreux utilisateurs et de forcer l'utilisateur à prouver qu'il est un être humain (pas un robot).

Aléatoire. L'URL de réinitialisation de mot de passe limitée dans le temps doit inclure un composant aléatoire et impossible à deviner. Assurez-vous d'utiliser un caractère aléatoire de qualité cryptographique. La sortie de /dev/urandom Ou System.Security.Cryptography.RNGCryptoServiceProvider Serait un bon choix. La sortie de Rand() ou random() ou System.Random N'est pas assez aléatoire et serait un mauvais choix. Un GUID ou horodatage n'est pas assez aléatoire et ne serait pas un bon choix.

Inclure une limite de temps. Le lien de confirmation de réinitialisation devrait expirer après un délai raisonnable: disons, 24 heures. Le lien ne doit être utilisable qu'une seule fois et doit expirer immédiatement dès qu'il est utilisé.

Inclure un texte explicatif dans l'e-mail. Vous pouvez ajouter du texte explicatif à l'e-mail, pour expliquer pourquoi l'e-mail a été envoyé, au cas où quelqu'un demanderait un réinitialiser pour un compte qui n'est pas le vôtre. Vous pouvez inclure du texte comme "Quelqu'un a demandé que le mot de passe soit réinitialisé pour votre compte username sur site. Si vous avez fait cette demande, cliquez ici pour changer votre mot de passe. Si vous ne l'avez pas fait cette demande, cliquez ici pour annuler la demande. "

Envoyer un e-mail après la réinitialisation du mot de passe. Une fois le mot de passe correctement réinitialisé, envoyer un e-mail à l'utilisateur pour lui faire savoir que le mot de passe a été modifié. N'incluez pas le nouveau mot de passe dans cet e-mail.

Surveiller les annulations. Vous pourriez envisager d'inclure une certaine logique pour surveiller la fréquence à laquelle les utilisateurs cliquent sur le lien d'annulation indiquant qu'ils n'ont pas demandé de réinitialisation. Si cela dépasse un certain seuil, il peut être utile d'envoyer une alerte aux opérateurs du système. De plus, si un lien d'annulation pour une demande est visité - après le lien de confirmation est visité, c'est une indication potentielle d'une attaque contre cet utilisateur - vous voudrez peut-être prendre des mesures à ce stade, par exemple , invalider le mot de passe de l'utilisateur et l'obliger à réinitialiser à nouveau son mot de passe. (Il s'agit d'une défense contre l'attaque suivante: l'attaquant accède à la boîte aux lettres de l'utilisateur, puis demande que son mot de passe sur votre site soit réinitialisé, puis visite le lien de confirmation. Si l'attaquant ne supprime pas ces e-mails de la boîte de réception de l'utilisateur, puis, lorsque le véritable utilisateur lit son e-mail, il peut cliquer sur le lien d'annulation, ce qui vous donne une indication de problèmes éventuels.

Utilisez HTTPS. Le lien doit utiliser https (pas http :), pour se protéger contre diverses attaques (par exemple, les attaques de Firesheep contre des utilisateurs naviguant sur le Web à partir d'Internet). café).

Enregistrez ces opérations. Je suggère de consigner toutes ces demandes. En plus d'enregistrer le nom d'utilisateur de l'utilisateur, vous souhaiterez peut-être enregistrer l'adresse IP du client qui a demandé qu'un lien de réinitialisation soit envoyé par courrier électronique à l'utilisateur, ainsi que l'adresse IP du client qui a visité le lien de réinitialisation.

Lectures supplémentaires. Vous pouvez également lire l'excellent article de blog de Troy Hunt, 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 . Merci à @coryT pour un lien vers cette ressource.

Enfin, envisagez l'authentification sans mot de passe. Les mots de passe posent de nombreux problèmes en tant que mécanisme d'authentification, et vous pourriez envisager d'autres méthodes d'authentification des utilisateurs, telles que le stockage d'un cookie persistant sur leur machine avec un secret impossible à deviner pour les authentifier. De cette façon, il n'y a aucun mot de passe à oublier et aucun moyen pour l'utilisateur d'être hameçonné, bien que vous deviez fournir un moyen à un utilisateur d'autoriser l'accès à partir d'une nouvelle machine ou d'un nouveau navigateur (éventuellement par e-mail à l'utilisateur pré- adresse e-mail enregistrée). Ce document d'enquête a un excellent aperçu de nombreuses méthodes d'authentification de secours et de leurs forces et faiblesses.

93
D.W.
15
coryT

N'importe quel endroit qui peut vous envoyer un mot de passe signifie qu'ils ne hachent pas le mot de passe, mais le stockent là où il est en quelque sorte déchiffrable en "texte clair". En soi, c'est mauvais.

Probablement pas "plus" sûr, mais plus sûr serait de:

Sur demande de mot de passe, envoyez un lien de réinitialisation du mot de passe à l'utilisateur avec GUID intégré. La session dans le GUID expire dans, hmm, heure ou plus.

9
Rich Homolka

OK, votre question est donc la suivante: comment structurer le processus de récupération de mot de passe/compte? Cela dépendra de ce que vous souhaitez optimiser: une expérience utilisateur sans tracas ou une bonne sécurité.

Si vous voulez une bonne sécurité:

  • Lors de l'inscription, l'utilisateur doit saisir son adresse e-mail.
  • Lors de l'inscription, l'utilisateur doit entrer un canal secondaire pour l'authentification - numéro de téléphone portable ou question-réponse (par exemple " quel est le nom de jeune fille de votre mère " ou mieux).

  • Pendant la récupération, votre système obtient d'abord une vérification grossière de l'identité au moyen du canal secondaire ci-dessus - la question du défi, ou en envoyant un code SMS au téléphone mobile, ou similaire.

  • Lorsque la première vérification d'identité ci-dessus est effacée, le système envoie un e-mail de réinitialisation du mot de passe à l'adresse e-mail précédemment saisie uniquement. Il s'agit d'une mesure supplémentaire importante pour empêcher f.x. exploits de type Sarah Palin .

  • L'email ne doit pas contient un nouveau mot de passe ou similaire. Il doit avoir un lien cliquable vers une page Web cryptée HTTPS sur votre site qui a) est liée au compte via une valeur secrète non devinable fournie dans l'URL, b ) est limité dans le temps, donc la récupération de compte ne fonctionne que x heures après avoir été demandée, c) permet à l'utilisateur final de créer un nouveau mot de passe.

  • Avoir une bonne journalisation sur toutes les transactions de réinitialisation de compte, et faire en sorte qu'un être humain les surveille et agisse si elles semblent suspectes (consultez les journaux du serveur pour les adresses IP fx, de nombreuses demandes proviennent-elles de la même adresse IP, y a-t-il des cas où un l'utilisateur tente de réinitialiser les mots de passe d'un pays différent de celui du propriétaire du compte enregistré, etc.).

Vous pouvez également contourner complètement cette complexité: Ce n'est encore que le début, mais OAuth/OpenID/connectez-vous via Facebook, Google etc supprime cette complexité entièrement de vos systèmes, mais avec un peut-être une convivialité moins bien établie .

9
Jesper M

Le moyen le plus sûr d'effectuer une réinitialisation de mot de passe consiste à générer un grand jeton de réinitialisation unique unique aléatoire, avec une date d'expiration, lié à l'ID utilisateur. Le jeton doit être haché dans la base de données, car un attaquant disposant d'un accès SQL pourrait l'utiliser pour réinitialiser des mots de passe utilisateur arbitraires.

Un lien de réinitialisation doit être envoyé à l'adresse e-mail, contenant le jeton de réinitialisation. Lorsque l'utilisateur clique sur le lien, le hachage du jeton doit être trouvé dans la base de données et la date d'expiration doit être vérifiée à l'avenir. Si ces conditions sont remplies, l'utilisateur devrait se voir présenter un écran lui permettant de saisir un nouveau mot de passe.

L'ensemble de ce processus doit être effectué via SSL, sinon un attaquant pourrait renifler l'URL et réinitialiser le mot de passe avant que l'utilisateur ne le fasse.

Quelques autres conseils:

  1. Secret questionne une gêne mineure pour les attaquants et une gêne majeure pour les utilisateurs. Évitez-les complètement.
  2. Présentez à l'utilisateur un défi de vérification humaine (par exemple un CAPTCHA) avant d'envoyer la réinitialisation du mot de passe. Cela empêche les demandes de réinitialisation automatisées.
  3. Vérifiez si l'adresse IP effectuant la réinitialisation est celle qui a réussi à se connecter au compte précédemment. Si ce n'est pas le cas, demandez d'autres détails sur le compte/l'utilisateur, par exemple année de création du compte, date de naissance, première ligne d'adresse.
  4. Ajoutez un lien "Je n'ai pas demandé cet e-mail", afin que les utilisateurs puissent signaler des demandes de réinitialisation de mot de passe erronées.
6
Polynomial

Un autre qui peut ou non convenir à votre application, mais qui est utilisé dans les applications bancaires en ligne et des types similaires, consiste à envoyer la moitié du code de réinitialisation par SMS messagerie à un téléphone mobile enregistré). Du point de vue d'un attaquant, il s'agit d'un PITA complet car il nécessite un compromis sur quelques canaux pour se casser.

6
Rory Alsop

Authentification à 2 facteurs via SMS! 1 vous connaissez le client et son numéro de portable, SMS leur un code unique à ajouter au site pour valider c'est eux: )

0
frank

Faites-la en quelques étapes. Par exemple quelque chose comme ça:

  1. L'utilisateur oublie son mot de passe. Il clique sur le bouton "J'ai oublié mon mot de passe, envoyez-moi un e-mail que faire ensuite" (l'étiquette du bouton peut différer;))
  2. Votre serveur lui envoie un lien www.yourdomain.com/lostpassword?param_1=x;param_2=y
  3. Il clique sur le lien et peut se créer un nouveau mot de passe
  4. Il clique sur soumettre. Tout est fait. Tout le monde heureux

Une seule et unique prise se trouve au point 3). Les valeurs X et Y doivent être aléatoires, imprévisibles et connectées à ce compte particulier. Ils devraient également être à usage unique et devraient devenir périmés après une courte période (24 heures?). Stockez les deux valeurs dans une table dédiée avec les colonnes correspondantes:

| some_id | user_id | X | Y | expire_time

Si un utilisateur essaie d'utiliser le lien approprié, vérifiez si le délai d'expiration n'est pas respecté et sinon, autorisez-le à changer le mot de passe.

0
Andrzej Bobak