En tant que je continue à construire de plus en plus de sites web et d'applications web, on me demande souvent de stocker les mots de passe des utilisateurs de manière à ce qu'ils puissent être récupérés si / quand l'utilisateur a un problème (soit pour envoyer un lien de mot de passe oublié par e-mail, les guider au téléphone, etc.) Quand je peux, je lutte amèrement contre cette pratique et je fais beaucoup de programmation « supplémentaire » pour rendre les réinitialisations de mot de passe et l'assistance administrative possibles sans stocker leur mot de passe réel.
Quand je ne peux pas lutter contre cela (ou ne pas gagner), alors j'encode toujours le mot de passe d'une manière ou d'une autre pour qu'il ne soit, au moins, pas stocké en texte brut dans la base de données—bien que je sache que si ma base de données est piratée, il ne serait pas difficile pour le coupable de craquer les mots de passe, ce qui me rend mal à l'aise.
Dans un monde parfait, les gens mettraient à jour leurs mots de passe régulièrement et ne les dupliqueraient pas sur de nombreux sites différents—malheureusement, je connais BEAUCOUP de personnes qui ont le même mot de passe pour le travail/la maison/l'e-mail/la banque, et qui me l'ont même donné librement quand ils ont besoin d'aide. Je ne veux pas être responsable de leur désastre financier si mes procédures de sécurité de base de données échouent pour une raison quelconque.
Moralement et éthiquement, je me sens responsable de protéger ce qui peut être, pour certains utilisateurs, leur gagne-pain même s'ils le traitent avec beaucoup moins de respect. Je suis sûr qu'il existe de nombreuses approches et arguments à faire pour saler les hachages et différentes options d'encodage, mais existe-t-il une seule « meilleure pratique » lorsque vous devez les stocker? Dans presque tous les cas, j'utilise PHP et MySQL si cela fait une différence dans la manière dont je dois gérer les détails.
Informations supplémentaires pour la prime
Je tiens à préciser que je sais que ce n'est pas quelque chose que vous voulez avoir à faire et que dans la plupart des cas, il est préférable de refuser de le faire. Cependant, je ne cherche pas une leçon sur les mérites de prendre cette approche, je cherche les meilleures étapes à suivre si vous décidez de prendre cette approche.
Dans une note ci-dessous, j'ai souligné le fait que les sites web principalement destinés aux personnes âgées, aux personnes ayant des problèmes mentaux ou aux très jeunes peuvent devenir déroutants pour les gens lorsqu'ils sont invités à effectuer une procédure sécurisée de récupération de mot de passe. Bien que nous puissions le trouver simple et banal, dans ces cas, certains utilisateurs ont besoin de l'aide supplémentaire d'un technicien de service pour les aider à accéder au système ou de le recevoir par e-mail/affiché directement.
Dans de tels systèmes, le taux d'attrition de ces groupes démographiques pourrait entraver l'application si les utilisateurs ne disposaient pas de ce niveau d'assistance d'accès, donc veuillez répondre en gardant cela à l'esprit.
Merci à tous
Cette question a été amusante avec beaucoup de débat et j'ai apprécié. En fin de compte, j'ai sélectionné une réponse qui garantit la sécurité des mots de passe (je n'aurai pas à conserver de mots de passe en texte brut ou récupérables), mais qui rend également possible pour la base d'utilisateurs que j'ai spécifiée de se connecter à un système sans les inconvénients majeurs que j'ai constatés avec la récupération normale de mots de passe.
Comme toujours, il y avait environ 5 réponses que j'aurais aimé marquer comme correctes pour différentes raisons, mais j'ai dû en choisir une seule - toutes les autres ont obtenu un +1. Merci à tous!
Aussi, merci à tous dans la communauté Stack qui ont voté pour cette question et/ou l'ont marquée comme favorite. Atteindre 100 votes positifs est pour moi un compliment et j'espère que cette discussion a aidé quelqu'un d'autre avec la même préoccupation que j'avais.
155 votes
Je pense qu'il sait que ce n'est pas bon. Il cherche toujours la meilleure solution sous les exigences déclarées.
33 votes
À la fin de la journée, tout ce que vous ferez, c'est mettre en œuvre soigneusement une vulnérabilité évitable.
0 votes
Vrai, mais la question était de savoir la manière la plus responsable de le faire ;)
20 votes
@Michael Brooks - Je veux que vous sachiez que je suis absolument d'accord avec CWE-257 et j'adorerais juste citer cela mot pour mot chaque fois que l'on me demande de rendre les mots de passe récupérables en texte clair. Cependant, en réalité, les clients et utilisateurs ne s'intéressent que rarement aux réglementations du NIST et veulent juste que je le fasse quand même. 90% du temps je peux les convaincre autrement mais dans ce 10% de temps où je ne peux pas, j'essaie de déterminer la meilleure action à suivre - dans ces cas, CWE-257 est comme des cendres dans ma main (malheureusement).
5 votes
@Shane, Peut-être devriez-vous demander comment implémenter une vulnérabilité de débordement de tampon de manière sécurisée. Rien ne vous empêche de mettre en place un système sûr. Utilisez des réinitialisations de mot de passe, s'ils ne connaissent pas leur mot de passe, ils doivent en créer un nouveau.
8 votes
@Michael Brooks - Je ne discute absolument pas le fait que votre suggestion est la meilleure façon de le faire. Cependant, certains groupes d'utilisateurs ciblés par les sites sur lesquels j'ai travaillé (par exemple, les personnes âgées ou les véritables non-utilisateurs d'ordinateurs) sont confus par ce que nous considérons comme des procédures standard de réinitialisation de mot de passe. Dans ces cas, la fonctionnalité (et non la sécurité) nécessiterait un rappel de mot de passe plutôt qu'une réinitialisation. Ce sont les moments où cela est venu pour moi - les clients ne veulent pas perdre d'utilisateurs précieux dans certains groupes démographiques en leur demandant d'effectuer une tâche qui leur semble très technique. J'espère que cela a du sens.
2 votes
@Shane/Michael : Par défaut, laissez l'utilisateur pouvoir récupérer le mot de passe en texte clair. Ensuite, proposez un paramètre utilisateur qui permet à l'utilisateur de faire un choix sécurisé afin de ne pas pouvoir récupérer le mot de passe en texte clair. Les utilisateurs avancés qui le peuvent choisiront ce paramètre.
4 votes
J'adore cette discussion! Cependant, un point important a été largement négligé par presque tout le monde... Ma réaction initiale était très similaire à celle de @Michael Brooks, jusqu'à ce que je réalise, comme @stefanw, que le problème ici est des exigences brisées, mais ce sont ce qu'ils sont. Mais ensuite, il m'est apparu que cela pourrait ne pas être le cas! Le point manquant ici, c'est la valeur non dite des actifs de l'application. En termes simples, pour un système de faible valeur, un mécanisme d'authentification entièrement sécurisé, avec tout le processus impliqué, serait excessif, et le mauvais choix de sécurité.
4 votes
(continuant) Évidemment, pour une banque, les "meilleures pratiques" sont indispensables, et il est impossible de violer éthiquement le CWE-257. Cependant, il est facile de penser à des systèmes de faible valeur où cela ne vaut tout simplement pas la peine (mais un simple mot de passe est toujours requis). Il est important de se rappeler que la véritable expertise en sécurité réside dans la recherche de compromis appropriés, et non dans la récitation dogmatique des "meilleures pratiques" que n'importe qui peut lire en ligne.
81 votes
@AviD: La "faible valeur" du système **n'a absolument aucune incidence** sur ce problème car **les gens réutilisent leurs mots de passe**. Pourquoi les gens ne peuvent-ils pas comprendre ce simple fait? Si vous craquez les mots de passe sur un système de "faible valeur", vous aurez probablement plusieurs mots de passe valides pour d'autres systèmes de "haute valeur".
20 votes
Un autre point a également été survolé, que je viens de mentionner dans le flux de commentaires de ma réponse: Comment savez-vous que la personne demandant ces exigences est digne de confiance? Et si l'excuse de "facilité d'utilisation" n'était qu'une façade masquant une intention réelle de voler les mots de passe à un moment donné dans le futur? Votre naïveté vient peut-être de coûter des millions de dollars aux clients et aux actionnaires. Combien de fois les experts en sécurité doivent-ils répéter cela avant que cela ne finisse par entrer dans votre esprit: Les menaces de sécurité les plus courantes et les plus graves sont toujours INTERNES.
8 votes
Est-il ironique que la solution la plus éthique ici soit de mentir et dire au client que les mots de passe ne peuvent pas être stockés de manière sécurisée et récupérables? Offrez en même temps une solution plus sécurisée, et peut-être aurez-vous convaincu quelqu'un que les mots de passe doivent être cryptés de manière irréversible.
0 votes
J'ai répondu aux commentaires ici, en bas de ma réponse, car elle était assez longue - je pense qu'il est important de revoir l'analyse et la discussion des problèmes soulevés. stackoverflow.com/questions/2283937/…
2 votes
À part de la discussion sur la sécurité, il me semble vraiment échapper pourquoi vous auriez besoin d'un tel système, même pour des audiences spécifiques. Si vos utilisateurs doivent déjà compter sur le support pour récupérer le mot de passe perdu, pourquoi ne pas avoir le support réinitialiser le mot de passe pour vos utilisateurs en premier lieu? Laissez le support générer un OTP, envoyer un e-mail à l'utilisateur avec un lien (ou un mot de passe) qui lui permettra de se connecter et de changer son mot de passe pour quelque chose de sensé et il n'y a pas besoin pour quiconque de voir ce qu'était le mot de passe...
4 votes
Vous pouvez les sauvegarder sous forme de sommes de contrôle md5 chiffrées, et mettre en place un réseau de CPU de 10 milliards de dollars pour attaquer plus tard par force brute le hash chiffré et obtenir le mot de passe en texte clair lorsque nécessaire... Simple..
3 votes
Une solution simple pourrait consister à utiliser un fournisseur OpenID (ou plus d'un), tel que Google, Facebook, etc. De cette manière, vous pouvez au moins dire : "Hey, c'est leur système de sécurité, demandez-leur !", tout en évitant de mettre en œuvre vous-même des fonctions de réinitialisation de mot de passe.