J'ai initialement posté cela comme une réponse ici dans ce fil mais je n'ai pas reçu beaucoup de commentaires à ce sujet, et maintenant je suis curieux de savoir ce que les autres pensent être la meilleure approche, ou s'il y a une différence entre les deux approches.
Le point de départ était de savoir s'il était plus sûr d'envoyer un lien de réinitialisation de mot de passe lorsqu'un utilisateur oublie son mot de passe sur un site Web, ou s'il fallait envoyer le mot de passe d'origine non chiffré dans un e-mail.
Désormais, ne pas saler et crypter un mot de passe est mauvais parce que lorsque la base de données est finalement volée sur le site Web, l'attaquant aura tous les mots de passe effacés le jour. D'accord, je comprends.
Mais si nous ignorons la possibilité que la base de données soit volée et que nous regardions seulement l'utilisateur oublier son mot de passe et passer par les "étapes de mot de passe oublié"; est-il plus, identique ou moins sûr d'envoyer un lien de réinitialisation sur un mot de passe en texte brut dans un e-mail?
Je pense que c'est la même chose. Parce que si un attaquant a accès à votre e-mail par quelque moyen que ce soit (il connaît vos informations de connexion par e-mail, ou il espionne le trafic quelque part), il a donc accès au mot de passe en clair envoyé ou au lien de réinitialisation - même si le temps est limité lien.
L'attaquant pourrait réinitialiser votre mot de passe avant même de savoir que vous avez un e-mail.
Ma pensée ici est-elle imparfaite?
Il est beaucoup plus simple d'accéder au corpus de messagerie existant que d'avoir accès au flux entrant. Par exemple, obtenir quelques minutes d'accès au système d'une personne permet de rechercher facilement dans son e-mail. Ainsi, dans le cas où un attaquant a accès aux anciens messages, mais pas au flux de nouveaux messages entrants:
Vous comptez sur l'utilisateur, soit en modifiant son mot de passe après l'avoir reçu (peu probable, étant donné que vous lui avez dit de quoi il s'agit), soit en supprimant (de manière permanente, pas d'archivage ou de déplacement vers un dossier `` poubelle '', également peu probable) le rappel message.
Si cela ne se produit pas, alors si j'ai accès au compte de messagerie de l'utilisateur un peu plus tard, un lien de réinitialisation (durée limitée/utilisation limitée, peut-être même limitée de sorte que l'attaquant ne peut pas facilement l'utiliser) ne sera pas utiliser pour moi, mais avoir le mot de passe (probablement encore valide) l'est certainement.
De plus, en m'envoyant le mot de passe en texte brut, vous démontrez que vous l'avez stocké dans un endroit accessible. Dans la plupart des cas, cela n'est pas nécessaire, car vous n'avez pas besoin de crypter le mot de passe (et sel/poivre), vous avez seulement besoin de le hacher. S'il est chiffré, toute personne ayant accès à la base de données et à la clé de déchiffrement (par exemple, probablement la plupart du personnel, ou toute personne qui vole le code avec la base de données) peut obtenir le mot de passe en texte brut. S'il est haché, vous devez l'obtenir avant le hachage (par exemple pendant une session de connexion).
De plus, bien que les gens ne le devraient pas, il est très courant d'utiliser le même mot de passe (ou des mots de passe très similaires) sur plusieurs sites. Cela signifie que plutôt que de fournir un moyen d'accéder à un seul compte, vous fournissez un moyen d'accéder à plusieurs.
Pour l'autre cas, où l'attaquant a accès à tous les messages entrants (potentiellement même la possibilité de supprimer les messages entrants avant que l'utilisateur ne les voie), aucun de ceux-ci n'est sécurisé. Le compte de messagerie est à haut risque , car si vous avez ce type d'accès, vous pouvez probablement accéder à tous les sites avec lesquels l'utilisateur a un compte et générer une réinitialisation du mot de passe. Pour éviter cela, vous devez utiliser autre chose (ou aussi bien que) votre compte de messagerie pour y accéder, comme l'authentification à deux facteurs.
Notez que même dans ce dernier cas, un lien de réinitialisation est toujours supérieur: si l'attaquant modifie le mot de passe de l'utilisateur via un lien de réinitialisation, puis lorsque l'utilisateur essaie de se connecter, il découvrira que quelque chose ne va pas (trop tard, mais au moins, ils le savent). Si vous fournissez simplement le mot de passe, l'utilisateur n'a aucune idée que l'attaquant y a silencieusement accédé.
Ok, ignorant le fait que les mots de passe sont stockés en texte brut et plongeant directement dans la question:. Le mot de passe est un justificatif d'identité qui a une longue validité, tandis qu'un lien de réinitialisation de mot de passe peut être défini de différentes manières:
Il convient également de noter qu'un ancien mot de passe, qui peut ne plus être valide sur le site votre, peut toujours être très sensible pour le client, car les gens réutilisent les mots de passe pour toutes sortes de services.
De cet aspect, mettre des mots de passe dans les boîtes de messagerie des gens pourrait être considéré comme grossier.
Il convient d'ajouter que si vous envoyez le mot de passe d'un utilisateur en clair, vous pouvez envoyer un mot de passe qu'il utilise également sur d'autres sites - même si vous forcez l'utilisateur à changer le mot de passe sur votre site lors de la prochaine connexion, vous ne lui avez fait aucune faveur. du tout.
Il est contraire à l'éthique de stocker des mots de passe en texte brut si vous avez le moindre souci pour vos utilisateurs. Vous devez stocker des hachages salés sécurisés. L'envoi d'un mot de passe en texte brut peut empêcher les utilisateurs soucieux de la sécurité d'utiliser votre service (même si les utilisateurs soucieux de la sécurité ne réutilisent pas les mots de passe; ils n'aiment tout simplement pas prendre en charge des services qui ne sont manifestement pas soucieux de la sécurité).
Quant à la façon de mettre en œuvre une réinitialisation du mot de passe; généralement pour un site moyennement sécurisé (par exemple, une carte de crédit), vous devez qu'ils répondent à certaines questions de sécurité de base (par exemple, le nom de jeune fille de la mère) et qu'ils contrôlent leur compte de messagerie ou leur numéro de téléphone, sous la forme d'une authentification à deux facteurs. Le lien ne doit être valide que dans un court laps de temps (heures en jours) et uniquement valide une fois (par exemple, inclut un jeton créé au hasard qui expire après la première utilisation et après une période de temps).
Vous leur notifiez également que le mot de passe a été réinitialisé (et même si leur adresse e-mail a été compromise; ils trouveront la preuve d'un attaquant lorsqu'ils ne pourront plus se connecter avec leur ancien mot de passe). L'envoi du mot de passe (sans le changer) signifie que cette attaque peut être effectuée furtivement sans que l'utilisateur ne le sache (si par exemple les e-mails ont été supprimés).
Il est préférable d'envoyer un lien de réinitialisation de mot de passe.
Certains sites ont le mot de passe oublié réinitialiser immédiatement le mot de passe à une valeur aléatoire, et qui est envoyé par e-mail à l'utilisateur. Cela présente une faille de déni de service - une personne qui n'est pas le propriétaire du compte peut provoquer la réinitialisation de son mot de passe. Le lien de réinitialisation du mot de passe évite cela, car le mot de passe n'est réinitialisé qu'une fois qu'un utilisateur a cliqué sur le lien - et il doit avoir accès à l'adresse e-mail pour ce faire.
Si vous voulez un peu de sécurité contre un attaquant qui a accès au courrier électronique de l'utilisateur, l'approche habituelle est de poser également des questions de sécurité. Ce sont des questions comme "Quel était le prénom de votre animal". Et le moment de les poser est après que l'utilisateur a cliqué sur le lien de réinitialisation du mot de passe dans l'e-mail.
Quelques bons conseils ici: https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet
Il est préférable d'envoyer un lien de réinitialisation.
En plus des raisons données par @Tony Meyer et @mhswende, la page du lien de réinitialisation peut nécessiter une authentification supplémentaire. De nombreux sites obligent les utilisateurs à répondre à des "questions de sécurité" à cet effet (l'ancien standard pré-informatique demande le nom de jeune fille de votre mère). Les sites qui ont votre numéro de téléphone peuvent, sur leur page de réinitialisation de mot de passe, vous demander d'entrer un code qu'ils ont envoyé par SMS. Les institutions financières peuvent poser des questions sur les anciens dossiers financiers (statistiques antérieures, etc.).
Il n'est pas trivial de trouver un bon mécanisme d'authentification secondaire, mais toute procédure de réinitialisation (ou de récupération) de mot de passe qui n'est pas suffisamment vulnérable que je qualifierais de négligente.