Le guide définitif de la forme authentification d'un site web [fermé]

en fonction du Formulaire d'authentification de sites web de

nous pensons que le débordement de la pile ne doit pas seulement être une ressource pour des questions techniques très spécifiques, mais aussi pour des directives générales sur la façon de résoudre des variations sur des problèmes communs. "Authentification basée sur des formulaires pour les sites web" doit être un excellent sujet pour une telle expérience.

il devrait inclure des sujets tels que:

  • comment se connecter
  • Comment faire déconnexion
  • Comment rester connecté
  • gestion des cookies (y compris les paramètres recommandés)
  • cryptage SSL/HTTPS
  • comment conserver les mots de passe
  • à l'Aide de questions secrètes
  • fonctionnalité Nom D'utilisateur/mot de passe oublié
  • l'Utilisation de nonces prévenir cross-site request forgeries (CSRF)
  • OpenID
  • "remember me" case à cocher
  • Navigateur de l'autocomplétion des noms d'utilisateur et mots de passe
  • URLs secrètes (publiques URL protégé par digest)
  • vérification de la résistance du mot de passe
  • E-mail de validation
  • et beaucoup plus à propos de authentification basée sur des formulaires ...

il ne devrait pas inclure des choses comme:

  • Rôles et autorisations
  • authentification HTTP basic

s'il vous Plaît aidez-nous par:

  1. , ce qui Suggère des sous-rubriques
  2. soumettre de bons articles sur ce sujet
  3. rédaction de la réponse officielle
5054
demandé sur Michiel de Mare 2008-08-02 23:51:50
la source

12 ответов

partie I: Comment Se connecter

nous supposerons que vous savez déjà construire un login+password HTML form qui affiche les valeurs à un script du côté du serveur pour l'authentification. Les sections ci-dessous traiteront des modèles pour l'auteur solide pratique, et comment éviter les pièges de sécurité les plus communs.

HTTPS ou de ne pas le HTTPS?

sauf si la connexion est déjà sécurisée (c'est-à-dire qu'elle est grâce à HTTPS en utilisant SSL / TLS), les valeurs de votre formulaire de connexion seront envoyées en clair, ce qui permet à quiconque écoutant sur la ligne entre le navigateur et le serveur web sera en mesure de lire les connexions au fur et à mesure qu'elles passent. Ce type de mise sur écoute est fait couramment par les gouvernements, mais en général, nous n'aborderons pas les fils "possédés" autrement que pour dire ceci: si vous protégez quelque chose d'important, utilisez HTTPS.

en substance, la seule pratique façon de protéger contre la mise sur écoute / reniflage de paquets pendant la connexion se fait en utilisant HTTPS ou un autre système de cryptage basé sur un certificat (par exemple, TLS ) ou un système éprouvé et testé de contestation-réponse (par exemple, le Diffie-Hellman -basé sur SRP). toute autre méthode peut être facilement contournée par un attaquant indiscret.

bien sûr, si vous êtes prêt à obtenir un peu impraticable, vous pouvez également employer une certaine forme D'un système d'authentification à deux facteurs (par exemple, L'application D'authentification Google, un manuel de codes physique de type "guerre froide", ou un dongle de générateur de clés RSA). Si appliqué correctement, cela pourrait fonctionner même avec une connexion non sécurisée, mais il est difficile d'imaginer qu'un dev serait prêt à implémenter deux facteurs auth mais pas SSL.

(Ne pas) à Rouler JavaScript de chiffrement et de hachage

étant donné le coût non nul et la perception technique difficulté de mettre en place un certificat SSL sur votre site web, certains développeurs sont tentés de lancer leurs propres systèmes de cryptage ou de hachage dans le navigateur afin d'éviter de passer des logins cleartext sur un fil non sécurisé.

bien qu'il s'agisse d'une pensée noble, elle est essentiellement inutile (et peut être un défaut de sécurité ) à moins qu'elle ne soit combinée avec l'un des ci - dessus- c'est-à-dire, soit la sécurisation de la ligne avec un cryptage fort ou en utilisant un mécanisme de contestation-réponse (si vous ne savez pas ce que c'est, sachez simplement que c'est l'un des concepts les plus difficiles à prouver, les plus difficiles à concevoir et les plus difficiles à mettre en œuvre dans la sécurité numérique).

S'il est vrai que le hachage du mot de passe peut être efficace contre divulgation du mot de passe , il est vulnérable aux attaques de replay, aux attaques D'homme-dans-le-milieu / détournements (si un attaquant peut injecter quelques bytes dans votre page HTML non sécurisée avant qu'elle n'atteigne votre navigateur, ils peuvent simplement Commenter le hashing dans le JavaScript), ou les attaques brute-force (puisque vous donnez à l'attaquant à la fois le nom d'utilisateur, sel et mot de passe hashé).

CAPTCHA contre l'humanité

CAPTCHAs sont destinés à contrecarrer une catégorie spécifique d'attaque: automatisé dictionnaire/brute force d'essais et d'erreur aucun opérateur humain. Il n'y a pas de doute que ce soit une menace réelle, mais il ya des moyens de traiter avec elle de façon transparente qui ne nécessitent pas un CAPTCHA, spécifiquement conçus correctement serverside login stretchling schemes - nous allons en discuter plus tard.

savoir que les implémentations CAPTCHA ne sont pas créés de la même façon; ils ne sont souvent pas humainement solubles, la plupart d'entre eux sont en fait inefficaces contre les bots, Tous sont inefficaces contre le travail bon marché du Tiers-Monde (selon OWASP , le le taux actuel de l'atelier clandestin est de 12 $pour 500 tests), et certaines implémentations peuvent être techniquement illégales dans certains pays (voir feuille de fraude D'authentification OWASP ). Si vous devez utiliser un CAPTCHA, utilisez le reCAPTCHA de Google , car il est OCR-dur par définition (car il utilise déjà OCR-scans de livre mal classifiés) et tente très difficile d'être convivial.

personnellement, J'ai tendance à trouver CAPTCHAS ennuyeux, et les utiliser seulement comme un dernier recours quand un utilisateur n'a pas réussi à se connecter un certain nombre de fois et les retards d'étranglement sont maximisés. Cela arrive rarement suffisante pour être acceptable, et il renforce le système dans son ensemble.

enregistrement des mots de passe / vérification des logins

cela peut finalement être de notoriété publique après tous les piratages hautement médiatisés et les fuites de données utilisateur que nous avons vu ces dernières années, mais il faut dire: Ne stockez pas de mots de passe en clair dans votre la base de données. Les bases de données des utilisateurs sont régulièrement piratées, divulguées ou glanées par L'injection SQL, et si vous stockez des mots de passe bruts en clair, c'est le jeu instantané pour votre sécurité de connexion.

donc si vous ne pouvez pas stocker le mot de passe, Comment vérifiez-vous que la combinaison login+mot de passe postée à partir du formulaire de login est correcte? La réponse est le hachage à l'aide d'une fonction de dérivation clé . Chaque fois qu'un nouvel utilisateur est créé, ou un mot de passe est changé, vous prenez la mot de passe et l'exécuter à travers un KDF, comme Argon2, bcrypt, scrypt ou PBKDF2, en transformant le mot de passe en clair ("correcthorsebatterystaple") en une longue chaîne de caractères au hasard, ce qui est beaucoup plus sûr à stocker dans votre base de données. Pour vérifier un login, vous exécutez la même fonction de hachage sur le mot de passe entré, cette fois en passant dans le sel et comparez la chaîne de hachage résultante à la valeur stockée dans votre base de données. Argon2, bcrypt et scrypt stockent déjà le sel avec le hash. Regardez ce l'article à la sec.stackexchange pour de plus amples informations.

la raison pour laquelle un sel est utilisé est parce que le hachage en lui-même n'est pas suffisant -- vous voudrez ajouter un soi-disant" sel "pour protéger le hachage contre tables arc-en-ciel . Un sel empêche effectivement deux mots de passe qui correspondent exactement d'être stockés comme la même valeur de hachage, empêchant l'ensemble de la base de données étant scanné en un seul passage si un attaquant exécute une devinette de mot de passe attaque.

un hachage cryptographique ne devrait pas être utilisé pour le stockage des mots de passe parce que les mots de passe choisis par l'utilisateur ne sont pas assez forts (c.-à-d. qu'ils ne contiennent généralement pas assez d'entropie) et une attaque de devinette de mot de passe pourrait être complétée en relativement peu de temps par un attaquant ayant accès aux hachages. C'est pourquoi un KDF est utilisé - ceux-ci effectivement "étirer la clé" ce qui signifie que chaque mot de passe deviner un attaquant fait implique itération de l'algorithme de hachage plusieurs fois, par exemple 10 000 fois, ce qui fait que le mot de passe de l'attaquant devine 10 000 fois plus lentement.

les données de Session - "Vous êtes connecté en tant que Spiderman69"

une fois que le serveur a vérifié le login et le mot de passe par rapport à votre base de données utilisateur et a trouvé une correspondance, le système a besoin d'un moyen de se rappeler que le navigateur a été authentifié. Ce fait ne devrait jamais être stocké côté serveur dans les données de session.

si vous n'êtes pas familier avec les données de session, voici comment cela fonctionne: une seule chaîne générée au hasard est stockée dans un cookie expirant et utilisée pour référencer une collection de données-les données de session - qui est stockée sur le serveur. Si vous utilisez un framework MVC, cela est sans doute déjà fait.

dans la mesure du possible, assurez-vous que le cookie de session affiche les indicateurs SECURE et HTTP uniquement lorsqu'il est envoyé au navigateur. Le drapeau de httponly fournit une certaine protection contre la lecture du cookie par une attaque XSS. Le drapeau secure garantit que le cookie n'est envoyé que via HTTPS, et donc protège contre les attaques réseau sniffing. La valeur du cookie ne doit pas être prévisible. Lorsqu'un cookie faisant référence à une session inexistante est présenté, sa valeur doit être remplacée immédiatement pour empêcher fixation de session .

partie II: Comment rester connecté - L'infâme "Se souvenir Me" Case À Cocher

les Cookies de connexion persistants (fonctionnalité" Se souvenir de moi") sont une zone dangereuse; d'une part, ils sont tout aussi sûrs que les connexions conventionnelles lorsque les utilisateurs comprennent comment les gérer; et d'autre part, ils représentent un risque énorme pour la sécurité dans les mains des utilisateurs négligents, qui peuvent les utiliser sur les ordinateurs publics et oublier de se déconnecter, et qui ne savent pas ce que sont les cookies de navigateur ou comment les supprimer.

personnellement, j'aime la persistance les connexions pour les sites web que je visite régulièrement, mais je sais comment les manipuler en toute sécurité. Si vous êtes certain que vos utilisateurs savent la même chose, vous pouvez utiliser des logins persistants avec une conscience propre. Si pas-bien, alors vous pouvez souscrire à la philosophie que les utilisateurs qui sont négligents avec leurs identifiants de connexion apporté sur eux-mêmes s'ils se font pirater. Ce n'est pas comme si on allait chez nos utilisateurs et qu'on arrachait tous ces Post-it inducteurs de facepalm avec des mots de passe qu'ils ont alignés sur le bord de leurs moniteurs.

bien sûr, certains systèmes ne peuvent pas se permettre d'avoir n'importe quels comptes piratés; pour de tels systèmes, il n'y a aucun moyen que vous puissiez justifier avoir des logins persistants.

si vous décidez D'implémenter des cookies de connexion persistants, c'est comme ça que vous le faites:

  1. tout D'abord, prenez le temps de lire article de Paragon Initiative sur le sujet. Vous aurez besoin d'obtenir un tas d'éléments droite, et l'article fait un excellent travail d'expliquer chacun.

  2. et juste pour réitérer l'un des pièges les plus communs, ne stockez pas le COOKIE de connexion persistant (TOKEN) dans votre base de données, seulement un hachage de celui-ci! le jeton de connexion est équivalent mot de passe, donc si un attaquant a mis la main sur votre base de données, ils peuvent utiliser les jetons pour se connecter à n'importe quel compte, tout comme s'il s'agissait de combinaisons login-mot de passe en clair. Par conséquent, utiliser le hachage (selon https://security.stackexchange.com/a/63438/5002 un hachage faible fera très bien dans ce but) lors du stockage de jetons de connexion persistants.

PARTIE III: à l'Aide de Questions Secrètes

Ne pas mettre en oeuvre une "secret" questions . La fonction "questions secrètes"est un modèle anti-sécurité. Lisez le document du lien Numéro 4 de la liste à lire absolument. Tu peux demander à Sarah Palin à propos de celle-là, après son Yahoo! le compte de messagerie a été piraté lors d'une campagne présidentielle précédente parce que la réponse à sa question de sécurité était... "Wasilla High School"!

même avec des questions spécifiées par l'utilisateur, il est très probable que la plupart des utilisateurs choisiront l'un ou l'autre:

  • Une "norme" question secrète comme la mère nom de jeune fille ou de favoris animal de compagnie

  • une simple anecdote que n'importe qui pourrait sortir de son blog, profil LinkedIn, ou similaire

  • toute question à laquelle il est plus facile de répondre que de deviner son mot de passe. Qui, pour tout mot de passe décent, est chaque question que vous pouvez imaginer

formes et variations, et ne devrait pas être employé dans un schéma d'authentification pour quelque raison que ce soit.

la vraie raison pour laquelle les questions de sécurité existent même dans la nature est qu'elles économisent commodément le coût de quelques appels d'assistance de la part d'utilisateurs qui ne peuvent pas accéder à leur e-mail pour accéder à un code de réactivation. Cela au détriment de la sécurité et de la réputation de Sarah Palin. Vaut-il? Probablement pas.

PARTIE IV: Mot de passe Oublié les Fonctionnalités

j'ai déjà mentionné pourquoi vous devriez n'utilisez jamais les questions de sécurité pour le traitement des mots de passe oubliés/perdus; il va de soi que vous ne devriez jamais envoyer un e-mail aux utilisateurs de leurs mots de passe réels. Il y a au moins deux autres pièges trop courants à éviter dans ce domaine:

  1. Don't reset un mot de passe oublié à un mot de passe fort autogénéré - de tels mots de passe sont notoirement difficile de se souvenir, ce qui signifie que l'utilisateur doit soit le changer ou l'écrire - disons, sur un poteau jaune vif-il sur le bord de leur moniteur. Au lieu de définir un nouveau mot de passe, il suffit de laisser les utilisateurs en choisir un tout de suite - ce qu'ils veulent faire de toute façon. (Une exception à cela pourrait être si les utilisateurs utilisent universellement un gestionnaire de mots de passe pour stocker/gérer des mots de passe qui seraient normalement impossibles à se rappeler sans le noter).

  2. Toujours hachez le code/token de mot de passe perdu dans la base de données. à nouveau , ce code est un autre exemple D'équivalent mot de passe, il doit donc être hachée au cas où un attaquant a obtenu leurs mains sur votre base de données. Quand un code de mot de passe perdu est demandé, envoyez le code en clair à l'adresse email de l'utilisateur, puis hachez-le, enregistrez le hachage dans votre base de données -- et jeter l'original . Tout comme un mot de passe ou un jeton de connexion persistante.

une dernière remarque: assurez-vous toujours que votre interface pour entrer le 'code de mot de passe perdu' est au moins aussi sûre que votre formulaire d'ouverture de session lui-même, ou un attaquant va simplement l'utiliser pour obtenir l'accès à la place. S'assurer que vous générez de très longs "codes de mot de passe perdus" (par exemple, 16 caractères alphanumériques sensibles à la casse) est un bon début, mais envisagez d'ajouter le même schéma d'étranglement que vous faites pour le formulaire de connexion lui-même.

partie V: Vérification De La Force Du Mot De Passe

tout d'abord, vous voudrez lire ce petit article pour un reality check: les 500 mots de passe les plus communs

Ok, donc peut-être que la liste n'est pas la canonique liste des mots de passe les plus communs sur n'importe quel système anywhere ever , mais c'est une bonne indication de la façon dont les gens vont mal choisir leurs mots de passe quand il n'y a pas de force obligatoire la politique en place. De plus, la liste semble affreusement proche de la maison quand vous la comparez aux analyses publiquement disponibles des mots de passe récemment volés.

donc: sans exigences minimales de résistance des mots de passe, 2% des utilisateurs utilisent l'un des 20 mots de passe les plus courants. Signification: si un attaquant obtient seulement 20 tentatives, 1 sur 50 comptes sur votre site web sera crackable.

pour contrecarrer cela, il faut calculer l'entropie d'un mot de passe et ensuite appliquer un seuil. Le National Institute of Standards and Technology (NIST) la Publication Spéciale de l'800-63 a un ensemble de très bonnes suggestions. Cela, lorsqu'il est combiné avec un dictionnaire et une analyse de la disposition du clavier (par exemple, 'qwertyuiop' est un mauvais mot de passe), peut rejeter 99% de tous les mots de passe mal sélectionnés à un niveau de 18 bits d'entropie. Il suffit de calculer la force du mot de passe et montrant un mètre de force visuelle à un l'utilisateur est bien, mais insuffisant. Si elle n'est pas appliquée, de nombreux utilisateurs l'ignoreront probablement.

et pour une prise rafraîchissante sur la convivialité des mots de passe de haute entropie, de Randall Munroe de la force de mot de passe xkcd est fortement recommandé.

PARTIE VI: Beaucoup Plus - Ou: la Prévention du Rapide-Feu de Tentatives de Connexion

tout D'abord, jeter un oeil aux chiffres: vitesse de récupération de mot de passe-combien de temps sera votre mot de passe Se lever

si vous n'avez pas le temps de regarder à travers les tableaux dans ce lien, voici la liste d'entre eux:

  1. Il faut pratiquement pas de temps pour cracker un mot de passe faible, même si vous êtes fissures avec un boulier

  2. Il faut pratiquement pas de temps à casser un alphanumériques 9 caractères du mot de passe, si c'est insensible à la casse

  3. Il faut pratiquement pas de temps à casser un complexe, des symboles et des lettres et des chiffres, majuscules et minuscules mot de passe, si il est de moins de 8 caractères de long (un PC de bureau peuvent rechercher l'ensemble de l'espace jusqu'à 7 caractères dans une affaire de jours ou même quelques heures)

  4. Il serait, cependant, prenez un temps excessif pour craquer même un mot de passe de 6 caractères, si vous étiez limité à une tentative par seconde!

Alors, que pouvons-nous apprendre de ces chiffres? Eh bien, beaucoup, mais nous pouvons nous concentrer sur la partie la plus importante: le fait que la prévention d'un grand nombre de tirs rapides tentatives successives de connexion (c.-à-d. le force brute attaque) n'est vraiment pas difficile. Mais l'empêchant droit n'est pas aussi facile qu'il y paraît.

en général, vous avez trois choix qui sont tous efficaces contre les attaques de force brute (et les attaques de dictionnaires, mais puisque vous employez déjà une politique de mots de passe forts, ils ne devraient pas être un problème) :

  • présentez un CAPTCHA après N tentatives ratées (ennuyeux comme l'enfer et souvent inefficace -- mais Je me répète ici)

  • comptes de verrouillage et nécessitant une vérification de courriel après N tentatives infructueuses (il s'agit d'une DoS attaque en attente de se produire)

  • et enfin, """""""""" beaucoup moins de chance et beaucoup plus compliqué à retirer).

meilleure pratique #1: un court délai qui augmente avec le nombre de tentatives ratées, comme:

  • 1 tentative ratée = aucun retard
  • 2 tentatives infructueuses = 2 secondes de retard
  • 3 tentatives infructueuses = 4 secondes de retard
  • 4 tentatives infructueuses = délai de 8 secondes
  • 5 tentatives infructueuses = retard de 16 secondes
  • etc.

DoS attaquer ce schéma serait très peu pratique, puisque le temps de lock-out résultant est légèrement plus grand que la somme des temps de lock-out précédents.

pour clarifier: le délai est et non un délai avant de retourner la réponse au navigateur. C'est plus comme une période de temps ou réfractaire pendant qui de tentatives de connexion à un compte spécifique ou à partir d'une adresse IP spécifique ne seront pas acceptées ou évaluées. C'est-à-dire que les justificatifs d'identité corrects ne seront pas retournés lors d'une connexion réussie, et que les justificatifs d'identité incorrects ne déclencheront pas d'augmentation du délai.

meilleure pratique #2: un délai de durée moyenne qui entre en vigueur après N tentatives infructueuses, comme:

  • 1-4 tentatives infructueuses = aucun retard
  • 5 tentatives infructueuses = 15-30 min retard

DoS attaquer ce schéma serait tout à fait impraticable, mais certainement faisable. Aussi, il peut être utile de noter qu'un délai aussi long peut être très ennuyeux pour un utilisateur légitime. Les utilisateurs oublieux pas vous.

meilleure pratique #3: combiner les deux approches - soit un délai fixe et court qui entre en vigueur après N tentatives ratées, comme:

  • 1-4 tentatives infructueuses = aucun retard
  • 5+ tentatives infructueuses = 20 sec de retard

Ou, de plus en plus de retard avec un fixe la limite supérieure de l', comme:

  • 1 tentative ratée = 5 sec délai
  • 2 tentatives infructueuses = retard de 15 secondes
  • 3+ tentatives infructueuses = 45 sec de retard

cette finale le système a été repris des suggestions de bonnes pratiques de L'OWASP (lien 1 de la liste à lire), et devrait être considéré comme une bonne pratique, même si elle est certes restrictive.

en règle générale, cependant, je dirais: plus votre politique de mot de passe est forte, moins vous avez à déranger les utilisateurs avec des retards. Si vous avez besoin de mots de passe forts (alphanumériques sensibles à la casse + nombres et symboles requis) de 9+ caractères, vous pouvez donner aux utilisateurs 2-4 tentatives non retardées de mot de passe avant d'activer l'étranglement.

DoS attaquant ce dernier stratagème d'étranglement de connexion serait très impraticable. Et comme une touche finale, toujours permettre aux logins persistants (cookie) (et/ou un formulaire de connexion vérifié par CAPTCHA) de passer, de sorte que les utilisateurs légitimes ne seront même pas retardés pendant que l'attaque est en cours . De cette façon, la très impossible attaque par déni de service devient un extrêmement impossible d'attaque.

en outre, il est logique de faire plus agressive étranglement sur les comptes admin, car ce sont les points d'entrée les plus attrayants

PARTIE VII: Distribué des Attaques de Force Brute

de même qu'un attaquant plus avancé tentera de contourner l'étranglement de la connexion en "étalant ses activités":

  • "151920920 de" Distribuer les tentatives d'un botnet pour empêcher l'adresse IP de repérage

  • plutôt que de choisir un utilisateur et d'essayer les 50.000 mots de passe les plus communs (ce qu'ils ne peuvent pas, en raison de notre étranglement), ils choisiront le mot de passe le plus commun et l'essai contre 50.000 utilisateurs à la place. De cette façon, non seulement ils obtiennent autour des tentatives maximales des mesures comme CAPTCHAs et se connecter étrangler, leur chance de succès augmente aussi bien, depuis le mot de passe numéro 1 le plus commun est beaucoup plus probable que le numéro 49.995

  • espacement des demandes de connexion pour chaque compte utilisateur, disons, à 30 secondes d'intervalle, pour se faufiler sous le radar

ici, la meilleure pratique serait l'enregistrement du nombre de logins défectueux, à l'échelle du système , et en utilisant une moyenne courante de la mauvaise fréquence de connexion de votre site comme base pour une limite supérieure qui vous imposez alors à tous les utilisateurs.

trop abstrait? Permettez-moi de reformuler:

dites que votre site a eu une moyenne de 120 mauvaises connexions par jour au cours des 3 derniers mois. En utilisant que (moyenne), votre système peut définir la limite globale de 3 fois plus-ie. 360 tentatives infructueuses sur une période de 24 heures. Ensuite, si le nombre total de tentatives ratées dans tous les comptes dépasse ce nombre en un jour (ou même mieux, surveiller le taux d'accélération et déclencher sur un seuil calculé), il active l'étouffement de connexion à l'échelle du système-ce qui signifie de courts délais pour tous les utilisateurs (encore, à l'exception des connexions de cookie et/ou de sauvegarde CAPTCHA).

j'ai aussi posté une question avec plus de détails et une très bonne discussion sur la façon d'éviter les pitfals délicats dans la lutte contre les attaques distribuées de la force brute

PARTIE VIII: l'Authentification à Deux facteurs et les Fournisseurs d'Authentification

Les justificatifs d'identité

peuvent être compromis, que ce soit par des exploits, des mots de passe étant écrits et perdus, des ordinateurs portables avec des clés étant volés, ou des utilisateurs entrant des logins dans les sites d'hameçonnage. Les ouvertures de session peuvent être protégées par une authentification à deux facteurs, qui utilise des facteurs hors bande tels que les codes à usage unique reçus d'un appel téléphonique, D'un message SMS, d'une application ou d'une dongle. Plusieurs fournisseurs offrent des services d'authentification à deux facteurs.

L'authentification

peut être entièrement déléguée à un service d'ouverture de session unique, où un autre fournisseur s'occupe de la collecte des justificatifs d'identité. Cela pousse le problème à un tiers de confiance. Google et Twitter fournissent tous deux des services de SSO basés sur des normes, tandis que Facebook fournit une solution propriétaire similaire.

MUST-READ LINKS About Web Authentication

  1. OWASP Guide Pour l'Authentification / OWASP Authentification Feuille de Triche
  2. Dos et Ne pas faire de l'Authentification du Client sur le Web (très lisible MIT document de recherche)
  3. Wikipedia: HTTP cookie
  4. connaissance Personnelle des questions pour définir l'authentification: les questions de Sécurité à l'ère de Facebook (très lisible Berkeley document de recherche)
3536
répondu Jens Roland 2018-07-18 19:31:15
la source

Article Définitif

Envoyer des informations d'authentification

le seul moyen pratique d'envoyer des justificatifs d'identité 100% en toute sécurité est d'utiliser SSL . Utiliser JavaScript pour hacher le mot de passe n'est pas sûr. Pièges courants pour le hachage de mot de passe côté client:

  • si la connexion entre le client et le serveur n'est pas cryptée, tout ce que vous faites est vulnérable aux attaques de l'homme du milieu . Un attaquant pourrait remplacer le javascript entrant pour briser le hachage ou envoyer toutes les informations d'identification à leur serveur, ils pourraient écouter les réponses des clients et imiter parfaitement les utilisateurs, etc. etc. SSL avec des Autorités de certification de confiance est conçu pour prévenir les attaques MitM.
  • le mot de passe hashé reçu par le serveur est moins sûr si vous ne faites pas de travail supplémentaire, redondant sur le serveur.

il y a une autre méthode sécurisée appelée SRP , mais elle est brevetée (bien qu'elle soit sous licence libre ) et il y a peu de bonnes implémentations disponibles.

stockage des mots de passe

ne stockez jamais de mots de passe en clair dans la base de données. Pas même si vous ne vous souciez pas de la sécurité de votre propre site. Supposons que certains de vos utilisateurs réutiliseront le mot de passe de leur compte bancaire en ligne. Donc, stockez le mot de passe hashé, et jeter l'original. Et assurez-vous que le mot de passe n'apparaît pas dans les journaux d'accès ou les journaux d'application. OWASP recommande L'utilisation D'Argon2 comme premier choix pour les nouvelles applications. Si cela n'est pas disponible, PBKDF2 ou scrypt doivent être utilisés à la place. Enfin, si aucun des éléments ci-dessus n'est disponible, utilisez bcrypt.

Hashes par eux-mêmes sont également peu sûrs. Par exemple, des mots de passe identiques signifient des hachages identiques--cela fait des tables de recherche de hachage un moyen efficace de déchiffrer beaucoup de mots de passe à la fois. À la place, entreposez le salé hash. Un sel est une chaîne de caractères ajoutée au mot de passe avant le hachage - utilisez un sel différent (aléatoire) par utilisateur. Le sel est une valeur publique, donc vous pouvez les stocker avec le hash dans la base de données. Voir ici pour plus d'informations à ce sujet.

cela signifie que vous ne pouvez pas envoyer à l'utilisateur leurs mots de passe oubliés (parce que vous n'avez que le hachage). Ne réinitialisez pas le mot de passe utilisateur, sauf si l'authentification de l'utilisateur (les utilisateurs doivent prouver qu'ils sont capables de lire les e-mails envoyés à l'stocké (et validé) adresse e-mail.)

questions de sécurité

les questions de sécurité ne sont pas sûres - évitez de les utiliser. Pourquoi? Tout ce qu'une question de sécurité fait, un mot de passe fait mieux. Lire PARTIE III: à l'Aide de Questions Secrètes dans @Jens Roland réponse ici, dans ce wiki.

cookies de Session

après l'ouverture de session, le serveur envoie à l'utilisateur un cookie de session. Le serveur peut récupérer le nom d'utilisateur ou identifiant du cookie, mais personne d'autre ne peut générer un tel cookie (TODO expliquer les mécanismes).

les Cookies peuvent être détournés : ils sont seulement aussi sûrs que le reste de la machine du client et d'autres communications. Ils peuvent être lus à partir du disque, reniflés dans le réseau trafic, soulevé par une attaque de scripting cross-site, phished à partir d'un DNS empoisonné afin que le client envoie leurs cookies aux mauvais serveurs. N'envoyez pas de cookies persistants. Les Cookies doivent expirer à la fin de la session du client (fermeture du navigateur ou sortie de votre domaine).

Si vous voulez autologin vos utilisateurs, vous pouvez définir un cookie persistant, mais il doit être distinct d'un cookie de session. Vous pouvez définir un drapeau supplémentaire que l'Utilisateur a ouvert une session automatique, et doit se connecter pour réel pour les opérations sensibles. Cela est apprécié par les sites de magasinage qui veulent vous fournir une expérience de magasinage personnalisée et transparente, tout en protégeant vos détails financiers. Par exemple, lorsque vous revenez visiter Amazon, ils vous montrent une page qui ressemble à vous êtes connecté, mais quand vous allez pour passer une commande (ou changer votre adresse de livraison, carte de crédit, etc.), ils vous demandent de confirmer votre mot de passe.

les sites Web financiers tels que les banques et les cartes de crédit, sur le d'autre part, n'ont que des données sensibles et ne devraient pas permettre auto-login ou un mode de faible sécurité.

liste des ressources externes

394
répondu Michiel de Mare 2018-03-07 09:35:31
la source

tout d'abord, une forte mise en garde que cette réponse n'est pas le meilleur ajustement pour cette question exacte. Il ne doit certainement pas être la réponse sommet!

j'irai de l'avant et mentionnerai la proposition de Mozilla BrowserID (ou peut-être plus précisément, le Verified Email Protocol ) dans l'esprit de trouver un chemin de mise à niveau vers de meilleures approches à l'authentification à l'avenir.

je vais résumer:

  1. Mozilla est une organisation sans but lucratif avec valeurs qui correspondent bien à trouver de bonnes solutions à ce problème.
  2. la réalité aujourd'hui est que la plupart des sites Web utilisent l'authentification fondée sur la forme
  3. en fonction du Formulaire d'authentification a un gros inconvénient, qui est l'augmentation du risque de phishing . On demande aux utilisateurs d'entrer des renseignements de nature délicate dans une zone contrôlée par une entité éloignée, plutôt que zone contrôlée par leur Agent Utilisateur (navigateur).
  4. Depuis que les navigateurs sont implicitement confiance (l'idée d'un Agent Utilisateur est d'agir au nom de l'Utilisateur), ils peuvent aider à améliorer cette situation.
  5. la principale force qui freine les progrès est le deployment deadlock . Les Solutions doivent être décomposées en étapes qui procurent des avantages supplémentaires par elles-mêmes.
  6. la méthode décentralisée la plus simple pour exprimer l'identité qui est intégrée dans l'infrastructure internet est le nom de domaine.
  7. Comme un deuxième niveau d'expression de l'identité, chaque domaine gère son propre ensemble de comptes.
  8. le formulaire "compte @ domaine " est concis et s'appuie sur un large éventail de protocoles et de schémas URI. Un tel identifiant est, bien sûr, universellement reconnu comme une adresse e-mail.
  9. les fournisseurs de messagerie électronique sont déjà les fournisseurs d'identité primaires en ligne. Les flux actuels de réinitialisation de mot de passe vous permettent généralement de prendre le contrôle d'un compte si vous pouvez prouver que vous contrôlez l'adresse e-mail associée à ce compte.
  10. le protocole de messagerie vérifié a été proposé pour fournir une méthode sécurisée, basée sur la cryptographie à clé publique, pour simplifier le processus de prouver au domaine B que vous avez un compte sur le domaine A.
  11. pour les navigateurs qui ne prennent pas en charge le protocole de messagerie vérifié (actuellement tous), Mozilla fournit un shim qui implémente le protocole dans le code JavaScript côté client.
  12. pour les services de messagerie qui ne prennent pas en charge le protocole de messagerie vérifié, le protocole permet à des tiers d'agir en tant qu'intermédiaire de confiance, affirmant qu'ils ont vérifié la propriété d'un utilisateur d'un compte. Il n'est pas souhaitable d'avoir un grand nombre de ces tiers; cette capacité est destiné uniquement à permettre à un chemin de mise à niveau, et il est préférable que les services de courriel fournissent eux-mêmes ces assertions.
  13. Mozilla offre son propre service pour agir comme un tiers de confiance. Les fournisseurs de services (C'est-à-dire les parties utilisatrices) qui mettent en œuvre le protocole de courriel vérifié peuvent choisir de faire confiance ou non aux affirmations de Mozilla. Le service de Mozilla vérifie la propriété des comptes des utilisateurs en utilisant les moyens conventionnels d'envoyer un e-mail avec un lien de confirmation.
  14. les fournisseurs de services peuvent, bien sûr, offrir ce protocole comme une option en plus de toute autre méthode(s) d'authentification qu'ils voudraient offrir.
  15. un avantage important de l'interface utilisateur recherché ici est le"sélecteur d'identité". Lorsqu'un utilisateur visite un site et choisit de s'authentifier, de leur navigateur affiche une sélection d'adresses e-mail ("personnel", "travail", "activisme politique", etc.), elles peuvent utiliser pour s'identifier sur le site.
  16. un autre avantage important de l'interface utilisateur étant recherché dans le cadre de ce effort est aider le navigateur en savoir plus sur la session de l'utilisateur – qui ils sont inscrits comme actuellement, principalement – afin qu'il peut afficher que dans le navigateur chrome.
  17. en raison de la nature distribuée de ce système, il évite le verrouillage des principaux sites comme Facebook, Twitter, Google, etc. Toute personne peut posséder son propre domaine et donc agir comme son propre fournisseur d'identité.

Ce n'est pas strictement "en fonction du formulaire d'authentification pour les sites web". Mais c'est un effort pour passer de la norme actuelle de l'authentification basée sur la forme à quelque chose de plus sûr: l'authentification supportée par le navigateur.

148
répondu Charlie 2012-11-07 23:12:50
la source

j'ai juste pensé que je partagerais cette solution que j'ai trouvé pour travailler très bien.

Je l'appelle le Dummy Field (bien que je n'ai pas inventé cela alors ne me croyez pas).

en bref: il suffit de l'insérer dans votre <form> et de vérifier qu'il est vide au moment de la validation:

<input type="text" name="email" style="display:none" />

le truc est de tromper un bot en pensant qu'il doit insérer des données dans un champ requis, c'est pourquoi j'ai nommé l'entrée "e-mail". Si vous avez déjà un champ appelé email que vous utilisez, vous devriez essayer de nommer le champ fictif quelque chose d'autre comme "Entreprise", "téléphone" ou "emailaddress". Il suffit de choisir quelque chose que vous savez que vous n'avez pas besoin et ce qui ressemble à quelque chose que les gens trouveraient logique de remplir dans un formulaire web. Maintenant, masquez le champ input en utilisant CSS ou JavaScript / jQuery-ce qui vous convient le mieux - juste ne pas mettez l'entrée type à hidden ou bien le bot ne tombera pas dans le panneau.

lorsque vous validez le formulaire (côté client ou serveur) vérifiez si votre champ factice a été rempli pour déterminer s'il a été envoyé par un humain ou un robot.

exemple:

dans le cas d'un être humain: L'utilisateur ne verra pas le champ dummy (dans mon cas nommé "email") et ne tentera pas de le remplir. Donc la valeur du champ dummy devrait toujours être vide lorsque le formulaire a été envoyé.

dans le cas d'un bot: le bot verra un champ dont le type est text et un nom email (ou quel que soit son nom) et tentera logiquement de le remplir avec des données appropriées. Il ne se soucie pas si vous avez stylé le formulaire d'entrée avec certains CSS de fantaisie, les développeurs web le font tout le temps. Quelle que soit la valeur dans le champ dummy, on s'en fiche tant que c'est plus grand que les caractères 0 .

j'ai utilisé cette méthode sur un livre d'or en combinaison avec CAPTCHA , et je n'ai pas vu un seul spam post depuis. J'avais utilisé une solution CAPTCHA-seulement avant, mais finalement il a résulté en environ cinq messages de spam chaque heure. Ajouter le champ dummy dans la forme a arrêté (au moins jusqu'à maintenant) tout le spam d'apparaître.

je pense que cela peut également être utilisé très bien avec un formulaire de connexion/authentification.

Avertissement : bien sûr, cette méthode n'est pas 100% infaillible. Les Bots peuvent être programmés pour ignorer les champs d'entrée avec le style display:none appliqué. Vous devez également penser aux personnes qui utilisent une certaine forme d'auto-completion (comme la plupart des navigateurs ont intégré! pour remplir automatiquement tous les champs du formulaire pour eux. Ils pourraient tout aussi bien ramasser un champ de marionnettes.

vous pouvez également faire varier ce vers le haut un peu en laissant le champ de mannequin visible mais en dehors de la les limites de l'écran, mais c'est totalement à vous.

soyez créatif!

121
répondu Pieter888 2012-11-13 08:19:49
la source

Je ne pense pas que la réponse ci-dessus soit" fausse", mais il y a de vastes zones d'authentification qui ne sont pas abordées (ou plutôt l'accent est mis sur" comment mettre en œuvre les sessions de cookies", et non sur"quelles options sont disponibles et quels sont les compromis".

mes modifications / réponses suggérées sont

  • le problème réside plus dans la configuration du compte que dans la vérification du mot de passe.
  • l'utilisation de deux facteurs d'authentification est beaucoup plus sûr que des moyens plus intelligents de cryptage de mot de passe
  • N'essayez pas de mettre en œuvre votre propre formulaire de connexion ou de stockage de mots de passe dans la base de données, à moins les données stockées sont sans valeur à la création de Compte et auto-généré (c'est-à-dire, le style WEB 2.0 comme Facebook, Flickr , etc.)

    1. l'Authentification Digest est une approche fondée sur les normes prises en charge dans tous les principaux navigateurs et les serveurs, qui ne seront pas envoyer un mot de passe même sur un canal sécurisé.

cela évite la nécessité d'avoir des "sessions" ou des cookies car le navigateur lui-même récrypte la communication à chaque fois. Il s'agit de l'approche de développement la plus" légère".

cependant, je ne recommande pas cela, sauf pour les services publics de faible valeur. Ceci est un problème avec certaines des autres réponses ci - dessus- ne pas essayer une ré-implémentation des mécanismes d'authentification côté serveur - ce problème a été résolu et est pris en charge par la plupart des principaux navigateurs. Ne pas utiliser des cookies. Ne stockez rien dans votre propre base de données roulée à la main. Il suffit de demander, par requête, si la requête est autorisée. Tout le reste devrait être pris en charge par la configuration et un logiciel tiers de confiance.

So ...

tout d'abord, nous confondons la création initiale d'un compte (avec un mot de passe) avec la nouvelle vérification du mot de passe par la suite. Si je suis Flickr et création de votre site pour la première fois, le nouvel utilisateur a accès à la valeur zéro (espace web vierge). Je ne me soucie vraiment pas si la personne créant le compte ment sur leur nom. Si je crée un compte de l'intranet / extranet de l'hôpital, la valeur réside dans tous les dossiers médicaux, et donc je do se soucient de l'identité (*) du créateur de Compte.

C'est la partie très difficile. La seulement solution décente est un web de confiance. Par exemple, vous rejoignez l'hôpital en tant que médecin. Vous créez une page web hébergée quelque part, avec votre photo, votre numéro de passeport et d'une clé publique, et de hachage avec la clé privée. Vous vous rendez ensuite à l'hôpital et l'administrateur du système regarde votre passeport, voit si la photo vous correspond, et ensuite hash la page web / hash photo avec la clé privée de l'hôpital. Désormais, nous pouvons échanger des clés et des jetons en toute sécurité. Comme toute personne qui fait confiance à l'hôpital (il y a le secret sauce BTW). L'administrateur du système peut également vous donner une RSA dongle ou autre authentification à deux facteurs.

mais c'est un lot de hassle, et pas très web 2.0. Cependant, c'est la seule façon sûre de créer de nouveaux comptes qui ont accès à des renseignements précieux qui ne sont pas créés par soi-même.

  1. Kerberos et SPNEGO - authentification unique sur les mécanismes avec un tiers de confiance - fondamentalement, l'utilisateur vérifie contre un tiers de confiance. (NB: il ne s'agit en aucun cas de ne pas faire confiance OAuth )

  2. SRP - une sorte d'authentification intelligente par mot de passe sans un tiers de confiance. Mais ici, nous entrons dans le domaine de "il est plus sûr d'utiliser l'authentification à deux facteurs, même si c'est plus coûteux"

  3. SSL côté client-fournir aux clients un certificat de clé publique (support dans tous les navigateurs principaux - mais soulève des questions sur la sécurité de la machine client).

en fin de compte, il s'agit d'un compromis - Quel est le coût d'une atteinte à la sécurité par rapport au coût de la mise en œuvre d'approches plus sécuritaires. Un jour, nous verrons peut-être une ICP largement acceptée et donc plus de formulaires d'authentification roulés et de bases de données propres. Un jour...

71
répondu you cad sir - take that 2012-11-09 20:56:07
la source

en cas de hachage, n'utilisez pas d'algorithmes de hachage rapide tels que MD5 (il existe de nombreuses implémentations matérielles). Utilisez quelque chose comme SHA-512. Pour les mots de passe, les hachages lents sont meilleurs.

plus vite vous pouvez créer des hachures, plus vite n'importe quel vérificateur de force brute peut travailler. Des coups de fouet plus lents ralentiront donc le forçage Brutal. Un algorithme de hachage lent rendra le forçage brut impraticable pour les mots de passe plus longs (8 chiffres +)

48
répondu josh 2013-08-04 22:09:35
la source

un bon article sur l'estimation réaliste de la force du mot de passe est:

Dropbox Tech Blog "Blog Archive" zxcvbn: realistic password strength estimation

47
répondu blade19899 2015-04-24 21:26:40
la source

ma règle préférée en ce qui concerne les systèmes d'authentification: utilisez des mots de passe, pas des mots de passe. Facile à retenir, difficile à casser. Plus de renseignements: coding Horror: mots de passe vs. Pass Phrases

42
répondu blade19899 2013-12-19 16:44:52
la source

j'aimerais ajouter une suggestion que j'ai utilisée, basée sur la défense en profondeur. Vous n'avez pas besoin d'avoir le même système auth&auth pour les administrateurs que les utilisateurs réguliers. Vous pouvez avoir un formulaire de connexion séparé sur une url séparée exécutant du code séparé pour les requêtes qui accorderont des privilèges élevés. Celui-ci peut faire des choix qui serait une douleur totale pour les utilisateurs réguliers. Un tel que j'ai utilisé est de réellement brouiller L'URL de connexion pour l'accès administrateur et envoyer à l'administrateur la nouvelle URL. Arrête toute attaque par la force brute tout de suite car votre nouvelle URL peut être arbitrairement difficile (très longue chaîne aléatoire) mais le seul inconvénient de votre utilisateur administrateur est de suivre un lien dans leur e-mail. L'attaquant ne sait même plus où poster.

20
répondu Iain Duncan 2015-07-18 04:18:52
la source

Je ne sais pas s'il était préférable de répondre à cette question sous forme de réponse ou de commentaire. J'ai opté pour la première option.

concernant le poing partie IV: fonctionnalité de mot de passe oublié dans la première réponse, je voudrais faire un point sur les attaques de synchronisation.

dans les formulaires Remember your password , un attaquant pourrait éventuellement vérifier une liste complète d'e-mails et détecter ceux qui sont enregistrés dans le système (voir le lien ci-dessous).

en ce qui concerne le formulaire de mot de passe oublié, je voudrais ajouter que c'est une bonne idée d'égaliser les temps entre les requêtes réussies et non réussies avec une certaine fonction de retard.

https://crypto.stanford.edu/~dabo / papers / webtiming.pdf

12
répondu xyz 2015-08-16 20:31:35
la source

je voudrais ajouter un commentaire très important:

  • "Dans un entreprises", 151960920" intra paramètre net," la plupart, si pas tous de ce qui précède peut ne pas s'appliquer!

de nombreuses entreprises déploient des sites web "à usage interne seulement" qui sont, en fait, des "applications d'entreprise" qui ont été mises en œuvre au moyen d'URLs. Ces URLs peuvent (supposément ...) seulement être résolu à l'intérieur de "la société du réseau interne." (dont le réseau inclut magiquement tous les guerriers de la route connectés au VPN.')

Lorsqu'un utilisateur est consciencieusement connecté audit réseau, leur identité ("authentification") est [déjà ...] "connu d'une manière concluante," comme c'est leur permission ("autorisation") de faire certaines choses ... notamment. .. "pour accéder à ce site."

This le service" Authentification + autorisation "peut être fourni par plusieurs technologies différentes, telles que LDAP (Microsoft OpenDirectory) , ou Kerberos.

de votre point de vue, vous savez simplement ceci: que quiconque qui se retrouve légitimement sur votre site web doit être accompagné d'une [variable d'environnement contenant magiquement ...] jeton."( c'est à dire L'absence d'un tel jeton doit être un motif immédiat pour 404 Not Found .)

la valeur du jeton n'a aucun sens pour vous, mais, si le besoin se présente," des moyens appropriés existent "par lesquels votre site web peut" [avec autorité] demander à quelqu'un qui sait (LDAP... etc.)" à propos de tout et chaque!) question que vous pourriez avoir. En d'autres termes, vous faites pas se prévaloir de tout "logique maison."Au lieu de cela, demandez-vous de L'Autorité et implicitement confiance à son jugement.

uh huh ... c'est tout à fait un interrupteur mental de" l'Internet sauvage et laineux."

10
répondu Mike Robinson 2015-08-14 02:09:36
la source

utiliser OpenID Connect ou User-Managed Access .

comme rien n'est plus efficace que de ne pas le faire du tout.

5
répondu jwilleke 2016-08-10 16:27:44
la source