Vous voyez, le monde des mots de passe oubliés est en fait assez mystérieux. Il existe de nombreux points de vue différents, parfaitement acceptables et beaucoup d'autres assez dangereux. Il y a de fortes chances que vous ayez rencontré chacun d'eux plusieurs fois en tant qu'utilisateur final; Je vais donc essayer d'utiliser ces exemples pour montrer qui fait les choses correctement et qui ne le fait pas, et sur quoi se concentrer pour implémenter correctement la fonction dans votre application.
Stockage des mots de passe: hachage, cryptage et (ooh!) Texte brut
Nous ne pouvons pas discuter de ce qu'il faut faire avec les mots de passe oubliés avant de discuter de la façon de les stocker. Dans la base de données, les mots de passe sont stockés dans l'un des trois types principaux:
- Texte simple. Il existe une colonne de mot de passe, qui est stockée en texte brut.
- . ( ), .
- . ( , ); , , , .
Soyons clairs avec la question la plus simple: ne jamais stocker les mots de passe en texte brut! Jamais. Une seule vulnérabilité d' injection , une sauvegarde effectuée par inadvertance ou l'une des dizaines d'autres erreurs simples - et c'est tout, joueur, tous vos mots de passe - c'est-à-dire, je suis désolé, tous les mots de passe de vos clients deviendront du domaine public. Bien sûr, cela signifiera une énorme possibilité que tous leurs mots de passe de tous leurs comptes dans d'autres systèmes deviennent du domaine public . Et ce sera votre faute.
Le chiffrement est meilleur, mais il a ses faiblesses. Le problème avec le cryptage est le décryptage; vous pouvez prendre ces chiffrements fous et les reconvertir en texte brut, et lorsque cela se produira, nous reviendrons à la situation avec des mots de passe lisibles. Comment cela peut-il arriver? Une petite faille pénètre dans le code qui déchiffre le mot de passe, le rendant accessible au public - c'est un moyen. Les pirates ont accès à la machine sur laquelle les données cryptées sont stockées - c'est la deuxième méthode. Une autre façon, encore une fois, est de voler la sauvegarde de la base de données, et quelqu'un obtient également la clé de cryptage, qui est souvent stockée très peu sécurisée.
Et cela nous amène au hachage. L'idée derrière le hachage est qu'il se fait dans un sens; la seule façon de comparer le mot de passe saisi par l'utilisateur avec sa version hachée est de hacher le mot de passe saisi et de le comparer. Pour éviter les attaques avec des outils comme les tables arc-en-ciel, nous utilisons du sel pour ajouter du caractère aléatoire au processus (lisez mon article sur le stockage cryptographique pour une image complète ). En fin de compte, s'ils sont mis en œuvre correctement, nous pouvons supposer en toute confiance que les mots de passe hachés ne redeviendront jamais du texte brut (je parlerai des avantages de divers algorithmes de hachage dans un autre article).
Un argument rapide sur le hachage et le cryptage: la seule raison pour laquelle vous aurez besoin de crypter plutôt que de hacher un mot de passe est lorsque vous avez besoin de voir le mot de passe en texte brut, et vous ne devriez jamais vouloir , du moins dans une situation standard. site Internet. Si vous en avez besoin, vous faites probablement quelque chose de mal!
Attention!
Ci-dessous dans le texte de l'article fait partie d'une capture d'écran du site pornographique AlotPorn. Il est soigneusement recadré et il n'y a donc rien qui ne puisse être vu sur la plage, mais si cela peut encore causer des problèmes, ne faites pas défiler la page.
Réinitialisez toujours votre mot de passe, ne le rappelez jamais
Vous a-t-on déjà demandé de créer une fonction de rappel de mot de passe? Prenez du recul et pensez à cette demande à l'envers: pourquoi ce «rappel» est-il nécessaire? Parce que l'utilisateur a oublié le mot de passe. Que voulons-nous vraiment faire? Aidez-le à se reconnecter.
Je comprends que le mot «rappel» est utilisé (souvent) de manière familière, mais ce que nous essayons vraiment de faire est d' aider en toute sécurité l'utilisateur à être à nouveau en ligne . Puisque nous avons besoin de sécurité, il y a deux raisons pour lesquelles un rappel (c'est-à-dire l'envoi de son mot de passe à l'utilisateur) n'est pas approprié:
- — . , HTTP ( HTTPS), , . , , , , , , , . — .
- . — ( ), .
Permettez-moi d'illustrer le problème avec usoutdoor.com à titre d'exemple : Voici une page de connexion typique:
Evidemment, le premier problème est que la page de connexion n'est pas chargée via HTTPS, mais le site propose également d'envoyer un mot de passe («Send Password»). Cela pourrait être un exemple de l'utilisation familière du terme mentionné ci-dessus, alors allons un peu plus loin et voyons ce qui se passe:
Cela n'a pas l'air beaucoup mieux, malheureusement; et l'e-mail confirme le problème:
Cela nous révèle deux aspects importants de usoutdoor.com:
- Le site ne hache pas les mots de passe. Au mieux, ils sont chiffrés, mais il est probable qu'ils soient stockés en texte brut; nous ne voyons aucune preuve du contraire.
- Le site envoie un mot de passe à long terme (nous pouvons revenir en arrière et l'utiliser encore et encore) sur un canal non sécurisé.
Dans cet esprit, nous devons vérifier si le processus de réinitialisation est effectué de manière sûre. La première étape pour ce faire est de s'assurer que le demandeur a le droit d'effectuer la réinitialisation. En d'autres termes, avant cela, nous avons besoin d'un contrôle d'identité; Jetons un coup d'œil à ce qui se passe lorsqu'une identité est vérifiée sans vérifier au préalable que le demandeur est bien le propriétaire du compte.
Liste des noms d'utilisateur et son impact sur l'anonymat
Ce problème est mieux illustré visuellement. Problème:
Voir? Faites attention au message "Aucun utilisateur n'est enregistré avec cette adresse e-mail" ("L'utilisateur avec cette adresse e-mail n'est pas enregistré"). Le problème se pose évidemment si un tel site confirme l' existence d'un utilisateur enregistré avec une telle adresse email. Bingo - vous venez de découvrir le fétiche porno de votre mari / patron / voisin!
Bien sûr, la pornographie est un exemple assez canonique de l'importance de la vie privée, mais le danger d'associer une personne à un site Web particulier est beaucoup plus large que la situation potentiellement délicate décrite ci-dessus. L'un des dangers est l'ingénierie sociale; si l'attaquant peut faire correspondre la personne avec le service, alors il disposera d'informations qu'il pourra commencer à utiliser. Par exemple, il peut contacter une personne se faisant passer pour un porte-parole du site Web et demander plus d'informations dans le but de lancer du harponnage .
Des pratiques comme celle-ci introduisent également le danger «d'énumération des noms d'utilisateur», par lequel vous pouvez vérifier qu'une collection entière de noms d'utilisateur ou d'adresses e-mail existe sur un site Web par de simples requêtes de groupe et en examinant les réponses. Avez-vous une liste des adresses e-mail de tous les employés et quelques minutes pour rédiger un script? Ensuite, vous voyez quel est le problème!
Quelle est l'alternative? En fait, c'est assez simple et bien implémenté dans Entropay :
Ici, Entropay est complètement silencieux sur l'existence d'une adresse e-mail dans son système pour quiconque ne possède pas l'adresse e- mail . Si vous possédez cette adresse et qu'elle n'existe pas dans le système, vous recevrez un e-mail comme celui-ci:
Bien sûr, il existe des situations acceptables dans lesquelles quelqu'un pense s'être enregistré sur le site Web. mais ce n'est pas le cas, ou l'a fait à partir d'une adresse e-mail différente. L'exemple ci-dessus gère bien les deux situations. Évidemment, si l'adresse correspond, vous recevrez un e-mail facilitant la réinitialisation de votre mot de passe.
La subtilité de la solution Entropay est que la vérification d'identité se fait par e-mail avant toute vérification en ligne. Certains sites demandent aux utilisateurs une question secrète (plus d'informations ci-dessous) avantcomment la réinitialisation peut commencer; Cependant, le problème avec cela est que vous devez répondre à la question tout en fournissant une forme d'identification (courrier ou nom d'utilisateur), ce qui rend presque impossible de répondre intuitivement sans révéler l'existence d'un compte utilisateur anonyme.
Il y a une légère diminution de la convivialité avec cette approche , car il n'y a pas de retour instantané en cas de tentative de réinitialisation d'un compte inexistant. Bien sûr, c'est tout l'intérêt d'envoyer un e-mail, mais du point de vue d'un véritable utilisateur final, s'il saisit la mauvaise adresse, la première fois qu'il ne le découvre que lorsqu'il reçoit la lettre. Cela peut provoquer des tensions de sa part, mais c'est un petit prix à payer pour un processus aussi rare.
Autre remarque, un peu hors sujet, les fonctions d'aide à la connexion qui révèlent le nom d'utilisateur ou l'adresse e-mail corrects ont le même problème. Répondez toujours à l'utilisateur avec un message «Votre combinaison nom d'utilisateur et mot de passe n'est pas valide», plutôt que de confirmer explicitement l'existence des informations d'identification (par exemple, «le nom d'utilisateur est correct, mais le mot de passe a été mal saisi»).
Envoi d'un mot de passe de réinitialisation ou envoi d'une URL de réinitialisation
Le concept suivant dont nous devons discuter est lié à la façon de réinitialiser un mot de passe. Il existe deux solutions populaires:
- Générer un nouveau mot de passe sur le serveur et l'envoyer par email
- Envoyez un e-mail avec une URL unique pour simplifier le processus de réinitialisation
Malgré les nombreux tutoriels , le premier point ne doit jamais être utilisé. Son problème est que cela signifie qu'il existe un mot de passe stocké qui peut être retourné et réutilisé à tout moment; il a été transmis sur un canal non sécurisé et reste dans votre boîte de réception. Il y a de fortes chances que les boîtes de réception soient synchronisées avec les appareils mobiles et le client de messagerie, et elles peuvent également être stockées en ligne dans le service de messagerie Web pendant très longtemps. Le fait est que la boîte aux lettres ne peut pas être considérée comme un support fiable pour le stockage à long terme .
Mais à part cela, le premier point a un autre problème sérieux - il simplifie autant que possiblebloquer le compte avec une intention malveillante. Si je connais l'adresse e-mail de la personne qui possède le compte sur le site, alors je peux le bloquer à tout moment en réinitialisant simplement son mot de passe; il s'agit d'une attaque par déni de service, disposée sur un plateau d'argent! C'est pourquoi la réinitialisation ne doit être effectuée qu'après une vérification réussie avec le demandeur du droit.
Lorsque nous parlons d'une URL de réinitialisation, nous entendons une adresse de site Web qui est unique à cette instance particulière du processus de réinitialisation . Cela devrait bien sûr être aléatoire, cela ne devrait pas être facile à deviner et il ne devrait pas contenir de liens de compte externes pour faciliter la réinitialisation. Par exemple, l'URL de réinitialisation ne doit pas être simplement un chemin comme "Reset /? Username = JohnSmith".
Nous voulons créer un jeton unique qui peut être envoyé par e-mail en tant qu'URL de réinitialisation, puis vérifié par rapport à un enregistrement de serveur par rapport au compte d'utilisateur, confirmant ainsi que le propriétaire du compte est bien la même personne qui tente de réinitialiser le mot de passe. ... Par exemple, un jeton peut être de la forme «3ce7854015cd38c862cb9e14a1ae552b» et est stocké dans la table avec l'ID utilisateur de l'utilisateur de réinitialisation et l'heure à laquelle le jeton a été généré (plus d'informations ci-dessous). Lors de l'envoi d'un e-mail, il contient une URL telle que "Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b", et lorsque l'utilisateur le charge, la page demande l'existence du jeton, après quoi elle confirme les informations de l'utilisateur et permet de changer le mot de passe.
Bien sûr, puisque le processus ci-dessus (espérons-le) permet à l'utilisateur de créer un nouveau mot de passe, assurez-vous que l'URL est chargée via HTTPS. Non, il ne suffit pas de l'envoyer avec une requête POST via HTTPS , cette URL avec le token doit utiliser la sécurité de la couche de transport pour qu'il soit impossible d'effectuer une attaque MITM sur le nouveau formulaire de mot de passe et le mot de passe créé par l'utilisateur est transmis via une connexion sécurisée.
En outre, pour l'URL de réinitialisation, vous devez ajouter une limite de temps de jeton afin que le processus de réinitialisation puisse être effectué dans un certain intervalle, par exemple, dans l'heure. Cela garantit que la fenêtre de réinitialisation est minimale afin que le destinataire de l'URL de réinitialisation ne puisse agir que dans cette très petite fenêtre. Bien sûr, l'attaquant peut recommencer le processus de réinitialisation, mais il devra obtenir une autre URL de réinitialisation unique.
Enfin, nous devons rendre ce processus unique. Une fois le processus de réinitialisation terminé, le jeton doit être supprimé pour que l'URL de réinitialisation ne soit plus fonctionnelle. Le point précédent est nécessaire pour que l'attaquant dispose d'une très petite fenêtre pendant laquelle il peut manipuler l'URL de réinitialisation. De plus, bien sûr, après une réinitialisation réussie, le jeton n'est plus nécessaire.
Certaines de ces étapes peuvent sembler excessivement redondantes, mais elles n'interfèrent pas du tout avec la convivialité et augmentent en fait la sécurité, bien que dans des situations que nous espérons être rares. Dans 99% des cas, l'utilisateur engagera la réinitialisation dans un laps de temps très court et ne réinitialisera pas le mot de passe dans un proche avenir.
Rôle de CAPTCHA
Oh, CAPTCHA, le remède que nous aimons tous détester! En fait, CAPTCHA ne signifie pas tant la protection que l'identification - vous êtes un humain ou un robot (ou un script automatisé). Son but est d'éviter la soumission automatique de formulaires, qui, bien entendu, peut être utilisée comme une tentative de violation de la sécurité. Dans le contexte de la réinitialisation des mots de passe, CAPTCHA signifie que la fonction de réinitialisation ne peut pas être craquée par force brute pour spammer l'utilisateur ou essayer de déterminer l'existence de comptes (ce qui, bien sûr, ne sera pas possible si vous avez suivi les conseils de la section sur la vérification d'identité).
Bien entendu, le CAPTCHA lui-même n'est pas idéal; il existe de nombreux précédents pour ses logiciels de «piratage» et l'obtention de taux de réussite suffisants (60-70%). De plus, il y a une solution montrée dans mon article sur le piratage des CAPTCHA avec des personnes automatisées où vous pouvez payer les gens une fraction d'un centime pour résoudre chaque CAPTCHA et obtenir un taux de réussite de 94%. Autrement dit, il est vulnérable, mais soulève (légèrement) la barrière à l'entrée.
Jetons un coup d'œil à un exemple PayPal:
Dans ce cas, le processus de réinitialisation ne peut tout simplement pas démarrer avant que le CAPTCHA soit résolu, il est donc théoriquement impossible d'automatiser le processus. En théorie.
Cependant, pour la plupart des applications Web, ce sera exagéré et c'est certainement une diminution de la convivialité - les gens n'aiment tout simplement pas les CAPTCHA! En outre, un CAPTCHA est une chose qui peut être facilement revisitée en cas de besoin. Si le service commence à être attaqué (la journalisation est utile ici, mais plus à ce sujet plus tard), alors l'ajout d'un CAPTCHA n'est nulle part plus facile.
Questions et réponses secrètes
Avec toutes les méthodes que nous avons examinées, nous avons pu réinitialiser le mot de passe simplement en ayant accès à un compte de messagerie. Je dis «juste», mais bien sûr, accéder illégalement au compte de messagerie de quelqu'un d'autre doit être difficile. Cependant, ce n'est pas toujours le cas .
En fait, le lien ci-dessus sur le piratage de Yahoo! de Sarah Palin sert deux objectifs; Premièrement, il illustre à quel point il est facile de pirater (certains) comptes de messagerie, et deuxièmement, il montre à quel point de mauvaises questions de sécurité peuvent être utilisées de manière malveillante. Mais nous y reviendrons plus tard.
Le problème avec la réinitialisation des mots de passe dépendant à 100% du courrier électronique est que l'intégrité du compte du site que vous essayez de réinitialiser devient à 100% dépendante de l'intégrité du compte de messagerie. Toute personne ayant accès à votre messagerie a accès à n'importe quel compte qui peut être réinitialisé en recevant simplement un e-mail . Pour de tels comptes, le courrier électronique est la «clé de toutes les portes» de votre vie en ligne.
Une façon d'atténuer ce risque consiste à implémenter un modèle de questions et réponses de sécurité. Nul doute que vous les avez vus avant: choisir une question qui ne vous devez répondreconnaître la réponse, après quoi, lorsque vous réinitialisez votre mot de passe, il vous est demandé. Cela ajoute à la confiance que la personne qui tente la réinitialisation est bien le propriétaire du compte.
De retour à Sarah Palin, l'erreur était que les réponses à sa / ses questions de sécurité pouvaient être facilement trouvées. En particulier, lorsque vous êtes une personnalité publique aussi importante, les informations sur le nom de jeune fille de votre mère, ses antécédents scolaires ou l'endroit où quelqu'un a pu vivre dans le passé ne sont pas si secrètes. En fait, la plupart d'entre eux peuvent être trouvés par presque tout le monde. Et c'est arrivé avec Sarah:
Le pirate informatique David Kernell a eu accès au compte de Palin en trouvant ses informations générales, telles que son université et sa date de naissance, puis en utilisant la fonction de récupération de mot de passe oublié de Yahoo!.
Il s'agit principalement d'un défaut de conception de la part de Yahoo! - En pointant ces questions simples, l'entreprise a essentiellement saboté la valeur de la question secrète, et donc la protection de son système. Bien sûr, la réinitialisation des mots de passe d'un compte de messagerie est toujours plus délicate car vous ne pouvez pas prouver la propriété en envoyant un e-mail au propriétaire (sans avoir une deuxième adresse), mais heureusement, il n'y a pas beaucoup de façons d'utiliser ce système aujourd'hui.
Retour aux questions secrètes - il existe une option pour donner à l'utilisateur la possibilité de créer ses propres questions. Le problème est que le résultat sera des questions terriblement évidentes: de
quelle couleur est le ciel?
Questions qui mettent les gens dans une position délicate lorsqu'une personne utilise une question de sécurité pour identifier(par exemple, centre d'appels):
Avec qui ai-je couché à Noël?
Ou des questions carrément stupides:
comment épelez-vous "mot de passe"?
En ce qui concerne les questions de sécurité, les utilisateurs doivent être sauvés d'eux-mêmes! En d'autres termes, la question secrète doit être déterminée par le site lui-même, ou mieux encore, elle doit poser une série de questions secrètes parmi lesquelles l'utilisateur peut choisir. Et ne vous contentez pas d'en choisir un ; idéalement, l'utilisateur doit sélectionner au moins deux questions de sécurité au moment de l'inscriptionqui sera ensuite utilisé comme deuxième canal d'identification. Avoir plusieurs questions augmente la confiance dans le processus de vérification, ainsi que la possibilité d'ajouter du caractère aléatoire (ne montrant pas toujours la même question), et fournit un peu de redondance au cas où l'utilisateur réel aurait oublié le mot de passe.
Quelle devrait être une bonne question de sécurité? Ceci est influencé par plusieurs facteurs:
- Il doit être bref - la question doit être claire et sans ambiguïté.
- La réponse doit être précise - nous n'avons pas besoin d'une question à laquelle une personne peut répondre de différentes manières
- Les réponses possibles doivent être variées - poser des questions sur la couleur préférée de quelqu'un donne un très petit sous-ensemble de réponses possibles
- — ( , ),
- — - ,
En l' occurrence , il existe un bon site Web de questions appelé GoodSecurityQuestions.com . Certaines des questions semblent plutôt bonnes, d'autres ne réussissent pas certains des tests décrits ci-dessus, en particulier le test de «facilité de recherche».
Permettez-moi de vous montrer comment les questions de sécurité sont implémentées dans PayPal et, en particulier, les efforts déployés par le site pour les identifier. Ci-dessus, nous avons vu une page pour démarrer le processus (avec un CAPTCHA), mais ici nous montrons ce qui se passe après avoir entré votre adresse e-mail et résolu le CAPTCHA:
En conséquence, l'utilisateur reçoit la lettre suivante:
Bien que ce soit normal, voici ce qui se cache derrière cette URL de réinitialisation:
Ainsi, des questions secrètes entrent en jeu. En fait, PayPal vous permet également de réinitialiser votre mot de passe en vérifiant votre numéro de carte de crédit.Il existe donc un canal supplémentaire auquel de nombreux sites n'ont pas accès. Je ne peux tout simplement pas changer mon mot de passe sans répondre aux deux questions de sécurité (ou sans connaître le numéro de carte). Même si quelqu'un saisit mon e-mail, il ne pourra pas réinitialiser le mot de passe de mon compte PayPal s'il ne connaît pas un peu plus d'informations personnelles sur moi. Quelle information? Voici les options de questions de sécurité offertes par PayPal:
La question de l'école et de l'hôpital est peut-être un peu douteuse en termes de facilité de recherche, mais le reste n'est pas si mal. Cependant, pour améliorer la sécurité, PayPal nécessite une identification supplémentaire pour modifier les réponses de sécurité:
PayPal est un exemple assez utopique de réinitialisation de mot de passe sécurisée: il implémente un CAPTCHA pour réduire le risque de force brute, nécessite deux questions secrètes, puis nécessite un autre type d'identification complètement différent juste pour changer les réponses - et c'est après que l'utilisateur est déjà connecté. C'est bien sûr ce que nous attendons de PayPal; c'est une institution financière qui gère de grosses sommes d'argent. Cela ne signifie pas que chaque réinitialisation de mot de passe doit suivre ces étapes - dans la plupart des cas, c'est exagéré - mais c'est un bon exemple lorsque la sécurité est une affaire sérieuse.
L'avantage du système de questions secrètes est que si vous ne l'avez pas implémenté tout de suite, il peut être ajouté plus tard si le niveau de protection des ressources l'exige. Un bon exemple de ceci est Apple, qui vient de mettre en œuvre ce mécanisme [écrit en 2012] . Une fois que j'ai commencé à mettre à jour l'application sur l'iPad, j'ai vu la demande suivante:
Ensuite, j'ai vu un écran où je pouvais sélectionner plusieurs paires de questions et réponses secrètes, ainsi qu'une adresse e-mail de secours:
Quant à PayPal, les questions sont pré-sélectionnées et certaines d'entre elles sont en fait assez bonnes:
Chacune des trois paires de questions et réponses représente un ensemble distinct de questions possibles, il existe donc de nombreuses façons de configurer un compte.
Un autre aspect à considérer concernant la réponse à la question de sécurité est le stockage. Trouver du texte brut dans DB pose presque les mêmes menaces que dans le cas d'un mot de passe, à savoir, la divulgation de la base de données révèle instantanément le sens et met en danger non seulement l'application, mais aussi des applications potentiellement complètement différentes utilisant les mêmes questions de sécurité (c'est encore une question de baies acai). Une option est le hachage sécurisé (algorithme fort et sel cryptographique aléatoire), cependant, contrairement à la plupart des cas de stockage de mots de passe, il peut y avoir une bonne raison pour que la réponse apparaisse sous forme de texte brut. Un scénario typique est une vérification d'identité par un opérateur en direct par téléphone. Bien sûr, dans ce cas, le hachage est également applicable (l'opérateur peut simplement entrer la réponse nommée par le client), mais dans le pire des cas, la réponse secrète doit se trouver à un certain niveau du magasin cryptographique, même s'il ne s'agit que d'un cryptage symétrique. Pour résumer: traitez les secrets comme des secrets!
Et le dernier aspect des questions et réponses secrètes - ils sont plus vulnérables à l'ingénierie sociale. Essayer d'obtenir directement le mot de passe du compte de quelqu'un d'autre est une chose, mais engager une conversation sur son éducation (une question secrète populaire) est complètement différent. En fait, vous pouvez communiquer de manière assez réaliste avec quelqu'un sur de nombreux aspects de sa vie qui peuvent constituer une question de sécurité, sans éveiller les soupçons. Bien sûr, l'essence même de la question secrète est qu'elle est liée à l'expérience de vie de quelqu'un, donc on s'en souvient, et c'est précisément le problème - les gens aiment parler de leurs expériences de vie! Il n'y a pas grand-chose à faire à ce sujet, uniquement en choisissant les options de questions de sécurité afin qu'elles soient moins susceptibles d'être retirées par l'ingénierie sociale.
[À suivre.]
La publicité
VDSina propose des serveurs fiables avec paiement quotidien , chaque serveur est connecté à un canal Internet de 500 Mégabits et est protégé des attaques DDoS gratuitement!