Le guide définitif de l'authentification de site Web basée sur un formulaire [fermé]

5373

Authentification basée sur les formulaires pour les sites Web

Nous pensons que Stack Overflow ne devrait 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 les variations des problèmes courants. "L'authentification par formulaire pour les sites Web" devrait être un bon sujet pour une telle expérience.

Il devrait inclure des sujets tels que:

  • Comment s'identifier
  • Comment se déconnecter
  • Comment rester connecté
  • Gérer les cookies (y compris les paramètres recommandés)
  • Cryptage SSL / HTTPS
  • Comment stocker les mots de passe
  • Utiliser des questions secrètes
  • Fonctionnalité de nom d'utilisateur / mot de passe oublié
  • Utilisation de nonces pour empêcher les falsifications de demandes intersites (CSRF)
  • OpenID
  • Case à cocher "Se souvenir de moi"
  • Autocomplétion par le navigateur des noms d'utilisateur et des mots de passe
  • URL secrètes ( URL publique protégée par résumé)
  • Vérification de la force du mot de passe
  • Validation par e-mail
  • et bien plus sur l' authentification par formulaire ...

Cela ne devrait pas inclure des choses comme:

  • Rôles et autorisation
  • Authentification de base HTTP

Veuillez nous aider en:

  1. Suggestion de sous-thèmes
  2. Soumettre de bons articles sur ce sujet
  3. Modification de la réponse officielle
Michiel de Mare
la source
52
Pourquoi exclure l'authentification HTTP de base? Il peut fonctionner dans les formulaires HTML via Ajax: peej.co.uk/articles/http-auth-with-html-forms.html
system PAUSE
55
L'authentification de base HTTP a la propriété d'être (relativement) difficile à faire oublier à un navigateur. Il est également horriblement dangereux si vous ne l'utilisez pas avec SSL pour sécuriser la connexion (par exemple, HTTPS).
Donal Fellows
24
Je pense qu'il vaudrait la peine de parler des sessions (y compris la fixation et le détournement) des cookies (les indicateurs sécurisés et http uniquement) SSO basé sur HTTP
symcbean
29
L' HttpOnlyindicateur de cookie super utile , qui empêche le vol de cookies basé sur JavaScript (un sous-ensemble d'attaques XSS), doit également être mentionné quelque part.
Alan H.8
80
Sensationnel. Des réponses longues, des dizaines de votes positifs pour certains d'entre eux, mais personne ne mentionne l'erreur courante de servir les formulaires de connexion via HTTP. J'ai même discuté avec des gens qui ont dit "mais il se soumet à https: // ..." et je n'ai eu que des regards vides lorsque j'ai demandé s'ils étaient sûrs qu'un attaquant n'a pas réécrit la page non chiffrée sur laquelle le formulaire a été servi. .
dzuelke

Réponses:

3764

PARTIE I: Comment se connecter

Nous supposerons que vous savez déjà comment créer un formulaire HTML de connexion + mot de passe qui POSTE les valeurs dans un script côté serveur pour l'authentification. Les sections ci-dessous traiteront des modèles d'authentification pratique et expliquent comment éviter les pièges de sécurité les plus courants.

Pour HTTPS ou pas pour HTTPS?

À moins que la connexion ne soit déjà sécurisée (c'est-à-dire tunnelée via HTTPS à l'aide de SSL / TLS), les valeurs de votre formulaire de connexion seront envoyées en texte clair, ce qui permet à toute personne qui écoute sur la ligne entre le navigateur et le serveur Web de pouvoir lire les connexions au fur et à mesure de leur passage par. Ce type d'écoute électronique est effectué de manière routinière par les gouvernements, mais en général, nous ne traiterons pas des fils «détenus» autrement que pour dire ceci: utilisez simplement HTTPS.

En substance, le seul moyen pratique de se protéger contre l'écoute électronique / le reniflement de paquets pendant la connexion est d'utiliser HTTPS ou un autre schéma de chiffrement basé sur certificat (par exemple, TLS ) ou un schéma de réponse-défi éprouvé (par exemple, le Diffie-Hellman SRP). Toute autre méthode peut être facilement contournée par un attaquant indiscret.

Bien sûr, si vous êtes prêt à devenir un peu impraticable, vous pouvez également utiliser une forme de schéma d'authentification à deux facteurs (par exemple, l'application Google Authenticator, un livre de codes physique `` style guerre froide '' ou un dongle de générateur de clé RSA). Si appliqué correctement, cela pourrait fonctionner même avec une connexion non sécurisée, mais il est difficile d'imaginer qu'un développeur serait prêt à implémenter l'authentification à deux facteurs mais pas SSL.

(Ne pas faire) Chiffrement / hachage JavaScript à votre guise

Étant donné le coût perçu (mais désormais évitable ) et la difficulté technique de la mise en place d'un certificat SSL sur votre site Web, certains développeurs sont tentés de lancer leurs propres schémas de hachage ou de chiffrement dans le navigateur afin d'éviter de passer des connexions en texte clair sur un câble non sécurisé.

Bien que ce soit une pensée noble, elle est essentiellement inutile (et peut être une faille de sécurité ) à moins qu'elle ne soit combinée avec l'une des solutions ci-dessus - c'est-à-dire, sécuriser la ligne avec un cryptage fort ou utiliser une réponse-défi éprouvée mécanisme (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 en matière de sécurité numérique).

S'il est vrai que le hachage du mot de passe peut être efficace contre la divulgation du mot de passe , il est vulnérable aux attaques de réexécution, aux attaques / détournements de Man-In-The-Middle (si un attaquant peut injecter quelques octets dans votre page HTML non sécurisée avant qu'elle n'atteigne votre navigateur, ils peuvent simplement commenter le hachage dans le JavaScript), ou les attaques par force brute (puisque vous remettez à l'attaquant à la fois le nom d'utilisateur, le sel et le mot de passe haché).

CAPTCHAS contre l'humanité

CAPTCHA est destiné à contrecarrer une catégorie spécifique d'attaque: dictionnaire automatisé / essais et erreurs par force brute sans opérateur humain. Il ne fait aucun doute qu'il s'agit d'une menace réelle, cependant, il existe des moyens de le gérer de manière transparente qui ne nécessitent pas de CAPTCHA, des schémas de limitation de connexion côté serveur spécifiquement conçus - nous en discuterons plus tard.

Sachez que les implémentations CAPTCHA ne sont pas créées de la même manière; ils ne sont souvent pas résolubles par l'homme, la plupart d'entre eux sont en fait inefficaces contre les robots, tous sont inefficaces contre la main-d'œuvre bon marché du tiers monde (selon l' OWASP , le taux d'atelier actuel est de 12 $ pour 500 tests), et certaines mises en œuvre peuvent être techniquement illégale dans certains pays (voir la feuille de triche d'authentification OWASP ). Si vous devez utiliser un CAPTCHA, utilisez reCAPTCHA de Google , car il est difficile par définition de l'OCR (car il utilise des numérisations de livres déjà classées de manière incorrecte par l'OCR) et essaie très fort d'être convivial.

Personnellement, j'ai tendance à trouver CAPTCHAS ennuyeux et à ne les utiliser qu'en dernier recours lorsqu'un utilisateur n'a pas réussi à se connecter plusieurs fois et que les délais de limitation sont maximisés. Cela se produira rarement assez pour être acceptable, et cela renforce le système dans son ensemble.

Stockage des mots de passe / vérification des connexions

Cela peut finalement être de notoriété publique après tous les hacks très médiatisés et les fuites de données utilisateur que nous avons vues ces dernières années, mais il faut dire: ne stockez pas les mots de passe en texte clair dans votre base de données. Les bases de données des utilisateurs sont systématiquement piratées, divulguées ou glanées par injection SQL, et si vous stockez des mots de passe bruts et en texte clair, c'est un 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 connexion est correcte? La réponse est le hachage à l'aide d'une fonction de dérivation de clé . Chaque fois qu'un nouvel utilisateur est créé ou qu'un mot de passe est modifié, vous prenez le mot de passe et l'exécutez via un KDF, tel que Argon2, bcrypt, scrypt ou PBKDF2, transformant le mot de passe en texte clair ("correcthorsebatterystaple") en une chaîne longue et aléatoire , ce qui est beaucoup plus sûr à stocker dans votre base de données. Pour vérifier une connexion, vous exécutez la même fonction de hachage sur le mot de passe entré, en passant cette fois 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 hachage. Consultez cet article sur sec.stackexchange pour des informations plus détaillées.

La raison pour laquelle un sel est utilisé est que le hachage en soi n'est pas suffisant - vous voudrez ajouter un soi-disant «sel» pour protéger le hachage contre les tables arc-en-ciel . Un sel empêche efficacement deux mots de passe qui correspondent exactement d'être stockés sous la même valeur de hachage, empêchant toute la base de données d'être analysée en une seule fois si un attaquant exécute une attaque de devinette de mot de passe.

Un hachage cryptographique ne doit pas être utilisé pour le stockage de mot de passe car les mots de passe sélectionnés par l'utilisateur ne sont pas assez forts (c'est-à-dire qu'ils ne contiennent généralement pas assez d'entropie) et une attaque de devinette de mot de passe pourrait être terminée en un temps relativement court par un attaquant ayant accès aux hachages. C'est pourquoi les KDF sont utilisés - ceux-ci "étirent la clé" , ce qui signifie que chaque mot de passe deviné par un attaquant provoque plusieurs répétitions de l'algorithme de hachage, par exemple 10 000 fois, ce qui oblige l'attaquant à deviner le mot de passe 10 000 fois plus lentement.

Données de session - "Vous êtes connecté en tant que Spiderman69"

Une fois que le serveur a vérifié la connexion et le mot de passe par rapport à votre base de données d'utilisateurs et trouvé une correspondance, le système a besoin d'un moyen de se rappeler que le navigateur a été authentifié. Ce fait ne doit 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 de manière aléatoire 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 sont stockées sur le serveur. Si vous utilisez un framework MVC, cela est sans aucun doute déjà géré.

Dans la mesure du possible, assurez-vous que le cookie de session a les indicateurs sécurisé et HTTP uniquement définis lorsqu'il est envoyé au navigateur. L'indicateur HttpOnly offre une certaine protection contre la lecture du cookie lors d'une attaque XSS. L'indicateur sécurisé garantit que le cookie est renvoyé uniquement via HTTPS et protège donc contre les attaques de reniflement du réseau. La valeur du cookie ne doit pas être prévisible. Lorsqu'un cookie référençant une session inexistante est présenté, sa valeur doit être remplacée immédiatement pour éviter la fixation de la session .

PARTIE II: Comment rester connecté - La fameuse case à cocher "Se souvenir de moi"

Les cookies de connexion persistants (fonctionnalité "se souvenir de moi") sont une zone de danger; d'une part, ils sont entièrement aussi sûrs que les connexions conventionnelles lorsque les utilisateurs savent comment les gérer; et d'autre part, ils représentent un énorme risque pour la sécurité entre les mains d'utilisateurs imprudents, qui peuvent les utiliser sur des ordinateurs publics et oublier de se déconnecter, et qui peuvent ne pas savoir ce que sont les cookies du navigateur ou comment les supprimer.

Personnellement, j'aime les connexions persistantes pour les sites Web que je visite régulièrement, mais je sais comment les gérer en toute sécurité. Si vous êtes certain que vos utilisateurs savent la même chose, vous pouvez utiliser des connexions persistantes avec une conscience propre. Si ce n'est pas le cas - eh bien, vous pouvez souscrire à la philosophie selon laquelle les utilisateurs négligents avec leurs identifiants de connexion s'en sont chargés s'ils étaient piratés. Ce n'est pas comme si nous allions chez nos utilisateurs et que nous déchirions toutes ces notes Post-It induisant le visage avec des mots de passe qu'ils ont alignés sur le bord de leur moniteur.

Bien sûr, certains systèmes ne peuvent pas se permettre d'avoir des comptes piraté; pour de tels systèmes, il n'y a aucun moyen de justifier d'avoir des connexions persistantes.

Si vous décidez de mettre en place des cookies de connexion persistants, voici comment procéder:

  1. Tout d'abord, prenez le temps de lire l'article de Paragon Initiative sur le sujet. Vous aurez besoin d'obtenir un bon nombre d'éléments, et l'article fait un excellent travail pour expliquer chacun.

  2. Et juste pour réitérer l'un des pièges les plus courants, NE PAS STOCKER LE COOKIE DE CONNEXION PERSISTANT (JETON) DANS VOTRE BASE DE DONNÉES, SEULEMENT UN HASH OF IT! Le jeton de connexion est équivalent au mot de passe, donc si un attaquant mettait la main sur votre base de données, il pourrait utiliser les jetons pour se connecter à n'importe quel compte, comme s'il s'agissait de combinaisons de mot de passe de connexion en texte clair. Par conséquent, utilisez le hachage (selon https://security.stackexchange.com/a/63438/5002, un hachage faible fera très bien l'affaire à cette fin) lors du stockage de jetons de connexion persistants.

PARTIE III: Utilisation de questions secrètes

Ne mettez pas en œuvre des «questions secrètes» . La fonction «questions secrètes» est un anti-modèle de sécurité. Lisez l'article du lien numéro 4 de la liste à lire absolument. Vous pouvez demander à Sarah Palin à ce sujet, après son Yahoo! Le compte de messagerie a été piraté lors d'une précédente campagne présidentielle 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 choisissent:

  • Une question secrète «standard» comme le nom de jeune fille de la mère ou l'animal préféré

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

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

En conclusion, les questions de sécurité sont intrinsèquement précaires dans pratiquement toutes leurs formes et variantes, et ne doivent pas être utilisées dans un schéma d'authentification pour une raison quelconque.

La vraie raison pour laquelle les questions de sécurité existent même dans la nature est qu'elles permettent de réduire facilement le coût de quelques appels d'assistance d'utilisateurs qui ne peuvent pas accéder à leur messagerie pour obtenir un code de réactivation. Cela au détriment de la sécurité et de la réputation de Sarah Palin. Ça vaut le coup? Probablement pas.

PARTIE IV: Fonctionnalité de mot de passe oublié

J'ai déjà expliqué pourquoi vous ne devriez jamais utiliser de questions de sécurité pour gérer les mots de passe utilisateur oubliés / perdus; il va également de soi que vous ne devez jamais envoyer aux utilisateurs par e-mail leurs mots de passe réels. Il y a au moins deux écueils trop communs à éviter dans ce domaine:

  1. Ne réinitialisez pas un mot de passe oublié en un mot de passe fort généré automatiquement - de tels mots de passe sont notoirement difficiles à retenir, ce qui signifie que l'utilisateur doit soit le modifier, soit l'écrire - par exemple, sur un Post-It jaune vif sur le bord de son moniteur. Au lieu de définir un nouveau mot de passe, laissez simplement les utilisateurs en choisir un nouveau immédiatement - c'est 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 à retenir sans l'écrire).

  2. Hachez toujours le code / jeton de mot de passe perdu dans la base de données. ENCORE , ce code est un autre exemple d'équivalent de mot de passe, il DOIT donc être haché au cas où un attaquant mettrait la main sur votre base de données. Lorsqu'un code de mot de passe perdu est demandé, envoyez le code en clair à l'adresse e-mail de l'utilisateur, puis hachez-le, enregistrez le hachage dans votre base de données - et jetez l'original . Tout comme un mot de passe ou un jeton de connexion persistant.

Une dernière remarque: assurez-vous toujours que votre interface pour entrer le `` code de mot de passe perdu '' est au moins aussi sécurisée que votre formulaire de connexion lui-même, ou un attaquant l'utilisera simplement pour y accéder à la place. Assurez-vous de générer 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 pensez à ajouter le même schéma de limitation 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 une vérification de la réalité: les 500 mots de passe les plus courants

D'accord, alors peut-être que la liste n'est pas la liste canonique des mots de passe les plus courants sur n'importe quel système, où que ce soit , mais c'est une bonne indication de la façon dont les gens choisissent mal leurs mots de passe lorsqu'il n'y a pas de politique appliquée en place. De plus, la liste semble terriblement proche de chez vous lorsque vous la comparez aux analyses accessibles au public des mots de passe récemment volés.

Donc: sans aucune exigence minimale 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 n'obtient que 20 tentatives, 1 compte sur 50 sur votre site Web sera crackable.

Pour éviter cela, il faut calculer l'entropie d'un mot de passe, puis appliquer un seuil. La publication spéciale 800-63 de l'Institut national des normes et de la technologie (NIST) propose un ensemble de très bonnes suggestions. Cela, lorsqu'il est combiné avec une analyse de la disposition du dictionnaire et 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 d'entropie de 18 bits. Le simple fait de calculer la force du mot de passe et de montrer un indicateur de force visuel à un utilisateur est bon, mais insuffisant. À moins qu'il ne soit appliqué, de nombreux utilisateurs l'ignoreront très probablement.

Et pour une approche rafraîchissante de la convivialité des mots de passe à haute entropie, Password Strength xkcd de Randall Munroe est fortement recommandé.

Utilisez l' API Have I Been Pwned de Troy Hunt pour vérifier les mots de passe des utilisateurs par rapport aux mots de passe compromis dans les violations de données publiques.

PARTIE VI: Beaucoup plus - Ou: Empêcher les tentatives de connexion à tir rapide

Tout d'abord, jetez un œil aux chiffres: Vitesses de récupération de mot de passe - Combien de temps votre mot de passe restera-t-il

Si vous n'avez pas le temps de parcourir les tableaux de ce lien, voici leur liste:

  1. Il ne faut pratiquement pas de temps pour déchiffrer un mot de passe faible, même si vous le déchirez avec un boulier

  2. Il ne faut pratiquement pas de temps pour déchiffrer un mot de passe alphanumérique à 9 caractères s'il n'est pas sensible à la casse

  3. Il ne faut pratiquement pas de temps pour déchiffrer un mot de passe complexe, composé de symboles et de lettres et de chiffres, en majuscules et en minuscules s'il contient moins de 8 caractères (un ordinateur de bureau peut rechercher tout l'espace de touches jusqu'à 7 caractères dans un sujet de jours ou même d'heures)

  4. Cependant, cela prendrait un temps excessif pour casser même un mot de passe à 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 d'empêcher un grand nombre de tentatives de connexion successives à tir rapide (c'est-à-dire l' attaque par force brute ) n'est vraiment pas si difficile. Mais empêcher droit n'est pas aussi facile qu'il semble.

De manière générale, vous avez trois choix qui sont tous efficaces contre les attaques par force brute (et les attaques par dictionnaire, mais puisque vous utilisez déjà une politique de mots de passe forts, ils ne devraient pas être un problème) :

  • Présenter un CAPTCHA après N tentatives infructueuses (ennuyeux comme l'enfer et souvent inefficaces - mais je me répète ici)

  • Verrouillage des comptes et exigeant une vérification des e-mails après N tentatives infructueuses (il s'agit d'une attaque DoS en attente de se produire)

  • Et enfin, la limitation de la connexion : c'est-à-dire la définition d'un délai entre les tentatives après N tentatives infructueuses (oui, les attaques DoS sont toujours possibles, mais au moins, elles sont beaucoup moins probables et beaucoup plus compliquées à réaliser).

Meilleure pratique n ° 1: un court délai qui augmente avec le nombre de tentatives infructueuses, comme:

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

Une attaque DoS contre ce schéma serait très peu pratique, car le temps de verrouillage résultant est légèrement supérieur à la somme des temps de verrouillage précédents.

Pour clarifier: Le délai n'est pas un délai avant de renvoyer la réponse au navigateur. Cela ressemble plus à un délai d'expiration ou à une période réfractaire pendant laquelle les tentatives de connexion à un compte spécifique ou à partir d'une adresse IP spécifique ne seront pas acceptées ou évaluées du tout. Autrement dit, les informations d'identification correctes ne reviendront pas dans une connexion réussie et les informations d'identification incorrectes ne déclencheront pas une augmentation de délai.

Meilleure pratique n ° 2: un délai de durée moyenne qui entre en vigueur après l'échec de N tentatives, comme:

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

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

Meilleure pratique n ° 3: Combiner les deux approches - soit un court délai fixe qui entre en vigueur après l'échec de N tentatives, comme:

  • 1-4 tentatives infructueuses = pas de retard
  • 5+ tentatives infructueuses = 20 secondes de retard

Ou, un retard croissant avec une limite supérieure fixe, comme:

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

Ce schéma final est tiré des suggestions de bonnes pratiques de l'OWASP (lien 1 de la liste MUST-READ) et doit être considéré comme une bonne pratique, même s'il est certes restrictif.

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

DoS attaquant ce schéma de limitation de connexion final serait très peu pratique. Et comme touche finale, autorisez toujours les connexions persistantes (cookies) (et / ou un formulaire de connexion vérifié par CAPTCHA), afin que les utilisateurs légitimes ne soient même pas retardés pendant que l'attaque est en cours . De cette façon, l'attaque DoS très impraticable devient une attaque extrêmement impraticable.

De plus, il est logique de limiter plus agressivement les comptes d'administrateur, car ce sont les points d'entrée les plus attrayants

PARTIE VII: Attaques réparties de force brute

Soit dit en passant, les attaquants plus avancés tenteront de contourner la limitation de la connexion en «répartissant leurs activités»:

  • Distribution des tentatives sur un botnet pour empêcher le marquage d'adresse IP

  • Plutôt que de choisir un utilisateur et d'essayer les 50 000 mots de passe les plus courants (ce qu'ils ne peuvent pas, en raison de notre limitation), ils choisiront LE mot de passe le plus courant et l'essayeront contre 50 000 utilisateurs à la place. De cette façon, non seulement ils contournent les mesures de tentatives maximales comme les CAPTCHA et la limitation de la connexion, mais leurs chances de succès augmentent également, car le mot de passe le plus courant numéro 1 est beaucoup plus probable que le numéro 49.995.

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

Ici, la meilleure pratique consisterait à enregistrer le nombre de connexions ayant échoué, à l'échelle du système , et à utiliser une moyenne mobile de la fréquence des mauvaises connexions de votre site comme base pour une limite supérieure que vous imposez ensuite à tous les utilisateurs.

Trop abstrait? Permettez-moi de reformuler:

Supposons que votre site ait enregistré en moyenne 120 mauvaises connexions par jour au cours des 3 derniers mois. En utilisant cela (moyenne courante), votre système peut fixer la limite globale à 3 fois - c'est-à-dire. 360 tentatives infructueuses sur une période de 24 heures. Ensuite, si le nombre total de tentatives infructueuses sur tous les comptes dépasse ce nombre en un jour (ou mieux, surveillez le taux d'accélération et le déclenchement sur un seuil calculé), il active la limitation de connexion à l'échelle du système, ce qui signifie de courts délais pour TOUS les utilisateurs. (toujours, à l'exception des connexions de cookies et / ou des connexions CAPTCHA de sauvegarde).

J'ai également posté une question avec plus de détails et une très bonne discussion sur la façon d'éviter les pièges délicats en repoussant les attaques par force brute distribuées

PARTIE VIII: Authentification à deux facteurs et fournisseurs d'authentification

Les informations d'identification peuvent être compromises, que ce soit par des exploits, des mots de passe écrits et perdus, des ordinateurs portables avec des clés volées ou des utilisateurs qui se connectent à des sites de phishing. Les connexions peuvent être davantage protégées avec 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'un dongle. Plusieurs fournisseurs proposent des services d'authentification à deux facteurs.

L'authentification peut être entièrement déléguée à un service d'authentification unique, où un autre fournisseur gère la collecte des informations d'identification. Cela pousse le problème à un tiers de confiance. Google et Twitter fournissent tous deux des services d'authentification unique basés sur des normes, tandis que Facebook propose une solution propriétaire similaire.

LIENS À LIRE À PROPOS À propos de l'authentification Web

  1. OWASP Guide To Authentication / OWASP Authentication Cheat Sheet
  2. À faire et à ne pas faire pour l'authentification des clients sur le Web (document de recherche du MIT très lisible)
  3. Wikipédia: cookie HTTP
  4. Questions de connaissances personnelles pour l'authentification de secours: questions de sécurité à l'ère de Facebook (document de recherche très lisible de Berkeley)
Jens Roland
la source
67
Eh bien, je ne suis pas vraiment d'accord avec la partie Captcha, oui, les Captchas sont ennuyeux et ils peuvent être cassés (sauf recaptcha mais cela est à peine résoluble par les humains!) Mais c'est exactement comme dire de ne pas utiliser de filtre anti-spam car il a moins de 0,1% de faux négatifs .. ce site utilise des Captchas, ils ne sont pas parfaits mais ils réduisent une quantité considérable de spam et il n'y a tout simplement pas de bonne alternative à eux
Waleed Eissa
235
@Jeff: Je suis désolé d'apprendre que vous avez des problèmes avec ma réponse. Je ne savais pas qu'il y avait un débat sur Meta à propos de cette réponse, je l'aurais volontiers édité moi-même si vous me l'aviez demandé. Et la suppression de mes messages vient de supprimer 1200 points de réputation de mon compte, ce qui fait mal :(
Jens Roland
13
"Après avoir envoyé les jetons d'authentification, le système a besoin d'un moyen de se souvenir que vous avez été authentifié - ce fait ne doit jamais être stocké côté serveur dans les données de session. Un cookie peut être utilisé pour référencer les données de session." Pas assez. Vous pouvez (et devriez, pour les serveurs sans état!) Utiliser un cookie signé cryptographiquement. C'est impossible à falsifier, ne bloque pas les ressources du serveur et n'a pas besoin de sessions persistantes ou d'autres manigances.
Martin Probst
12
"un ordinateur de bureau peut rechercher le FULL KEYSPACE jusqu'à 7 caractères en moins de 90 jours" Une machine avec un GPU récent peut rechercher l'espace de clé complet de 7 caractères en moins d'un jour. Un GPU haut de gamme peut gérer 1 milliard de hachages par seconde. golubev.com/hashgpu.htm Cela conduit à certaines conclusions sur le stockage des mots de passe qui ne sont pas directement traitées.
Frank Farmer
9
Je suis surpris que la protection CSRF n'ait pas été mentionnée ...
Flukey
418

Article définitif

Envoi d'informations d'identification

Le seul moyen pratique d'envoyer des informations d'identification à 100% en toute sécurité est d'utiliser SSL . L'utilisation de JavaScript pour hacher le mot de passe n'est pas sûre. 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 chiffré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, il pourrait écouter les réponses des clients et usurper parfaitement l'identité des utilisateurs, etc. etc. SSL avec des autorités de certification de confiance est conçu pour empêcher les attaques MitM.
  • Le mot de passe haché reçu par le serveur est moins sécurisé si vous n'effectuez pas de travail supplémentaire et redondant sur le serveur.

Il existe 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 les mots de passe sous forme de texte en clair dans la base de données. Même si vous ne vous souciez pas de la sécurité de votre propre site. Supposons que certains de vos utilisateurs réutilisent le mot de passe de leur compte bancaire en ligne. Conservez donc le mot de passe haché et jetez 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 ce n'est pas disponible, PBKDF2 ou scrypt doivent être utilisés à la place. Et enfin, si aucun des éléments ci-dessus n'est disponible, utilisez bcrypt.

Les hachages en eux-mêmes sont également précaires. Par exemple, des mots de passe identiques signifient des hachages identiques - cela fait des tables de recherche de hachage un moyen efficace de casser de nombreux mots de passe à la fois. Au lieu de cela, stockez le hachage salé . Un sel est une chaîne ajoutée au mot de passe avant le hachage - utilisez un sel différent (aléatoire) par utilisateur. Le sel est une valeur publique, vous pouvez donc les stocker avec le hachage dans la base de données. Voir ici pour en savoir plus.

Cela signifie que vous ne pouvez pas envoyer à l'utilisateur ses mots de passe oubliés (car vous ne disposez que du hachage). Ne réinitialisez pas le mot de passe de l'utilisateur à moins que vous n'ayez authentifié l'utilisateur (les utilisateurs doivent prouver qu'ils sont capables de lire les e-mails envoyés à l'adresse e-mail stockée (et validée).)

Questions de sécurité

Les questions de sécurité ne sont pas sécurisées - évitez de les utiliser. Pourquoi? Tout ce qu'une question de sécurité fait, un mot de passe fait mieux. Lisez la PARTIE III: Utilisation des questions secrètes dans la réponse @Jens Roland ici dans ce wiki.

Cookies de session

Une fois l'utilisateur connecté, le serveur envoie à l'utilisateur un cookie de session. Le serveur peut récupérer le nom d'utilisateur ou l'ID du cookie, mais personne d'autre ne peut générer un tel cookie (mécanismes d'explication TODO).

Les cookies peuvent être piratés : ils ne sont 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 trafic réseau, levés par une attaque de script intersite, hameçonnés à partir d'un DNS empoisonné afin que le client envoie ses cookies aux mauvais serveurs. N'envoyez pas de cookies persistants. Les cookies doivent expirer à la fin de la session client (fermeture du navigateur ou sortie de votre domaine).

Si vous souhaitez connecter automatiquement vos utilisateurs, vous pouvez définir un cookie persistant, mais il doit être distinct d'un cookie de session complète. Vous pouvez définir un indicateur supplémentaire que l'utilisateur a automatiquement connecté et doit se connecter pour de vrai pour les opérations sensibles. Ceci est populaire auprès des sites d'achat qui souhaitent vous offrir une expérience d'achat transparente et personnalisée tout en protégeant vos informations financières. Par exemple, lorsque vous revenez visiter Amazon, ils vous montrent une page qui semble que vous êtes connecté, mais lorsque vous passez une commande (ou changez votre adresse de livraison, votre 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, en revanche, ne contiennent que des données sensibles et ne devraient pas autoriser la connexion automatique ou un mode de faible sécurité.

Liste des ressources externes

Michiel de Mare
la source
1
Compte tenu de la récente vulnérabilité MITM entourant les certificats SSL signés ( blog.startcom.org/?p=145 ), une combinaison de SSL et d'une sorte d'authentification de réponse Challenge (il existe des alternatives à SRP) est probablement une meilleure solution.
Kevin Loney
beaucoup de ces choses sont situationnelles. j'ai tendance à ne pas utiliser du tout les cookies de session. Les cookies piratés sont presque toujours la faute des serveurs. homme au milieu / reniflement de paquets n'est pas si commun
Shawn
Package BCrypt Nuget: nuget.org/List/Packages/BCrypt
Fabian Vilers
1
Note 1 sur cette réponse: c'est un brouillon, à éditer comme wiki. Si vous pouvez modifier cela, vous êtes le bienvenu.
Peter Mortensen
SRP est spécifique à la présence de plusieurs parties si je comprends bien
Webwoman
162

Tout d'abord, une mise en garde ferme que cette réponse n'est pas la meilleure solution pour cette question exacte. Ce ne devrait certainement pas être la meilleure réponse!

Je vais aller de l'avant et mentionner le BrowserID proposé par Mozilla (ou peut-être plus précisément, le protocole de courrier électronique vérifié ) dans l'esprit de trouver un chemin de mise à niveau vers de meilleures approches d'authentification à l'avenir.

Je vais le résumer de cette façon:

  1. Mozilla est un organisme sans but lucratif dont les valeurs correspondent bien à la recherche de bonnes solutions à ce problème.
  2. La réalité est que la plupart des sites Web utilisent une authentification basée sur un formulaire
  3. L'authentification basée sur les formulaires présente un gros inconvénient, qui est un risque accru de phishing . Les utilisateurs sont invités à saisir des informations sensibles dans une zone contrôlée par une entité distante, plutôt que dans une zone contrôlée par leur agent utilisateur (navigateur).
  4. Étant donné que les navigateurs sont implicitement approuvés (l'idée même 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 ici est l' impasse du déploiement . Les solutions doivent être décomposées en étapes qui procurent à elles seules des avantages supplémentaires.
  6. La méthode décentralisée la plus simple pour exprimer une identité intégrée à l'infrastructure Internet est le nom de domaine.
  7. En tant que deuxième niveau d'expression de l'identité, chaque domaine gère son propre ensemble de comptes.
  8. Le formulaire « @domaine du compte » est concis et pris en charge par un large éventail de protocoles et de schémas d'URI. Un tel identifiant est, bien entendu, le plus universellement reconnu comme une adresse e-mail.
  9. Les fournisseurs de messagerie sont déjà de facto les principaux fournisseurs d'identité en ligne. Les flux de réinitialisation de mot de passe actuels 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 courrier électronique vérifié a été proposé pour fournir une méthode sécurisée, basée sur la cryptographie à clé publique, pour rationaliser 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 courrier électronique vérifié (actuellement tous), Mozilla fournit un module d'interface qui implémente le protocole dans du code JavaScript côté client.
  12. Pour les services de messagerie qui ne prennent pas en charge le protocole de courrier électronique 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 sur un compte. Il n'est pas souhaitable d'avoir un grand nombre de ces tiers; cette capacité est uniquement destinée à permettre un chemin de mise à niveau, et il est préférable que les services de messagerie fournissent eux-mêmes ces assertions.
  13. Mozilla propose 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 courrier électronique vérifié peuvent choisir de faire confiance aux assertions de Mozilla ou non. Le service de Mozilla vérifie la propriété du compte 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 en option en plus de toute autre méthode d'authentification qu'ils pourraient souhaiter offrir.
  15. Un grand avantage d'interface utilisateur recherché ici est le «sélecteur d'identité». Lorsqu'un utilisateur visite un site et choisit de s'authentifier, son navigateur lui montre une sélection d'adresses e-mail ("personnelles", "travail", "activisme politique", etc.) qu'il peut utiliser pour s'identifier sur le site.
  16. Un autre avantage important de l'interface utilisateur recherché dans le cadre de cet effort est d' aider le navigateur à en savoir plus sur la session de l'utilisateur - à qui il est actuellement connecté, principalement - afin qu'il puisse l'afficher dans le chrome du navigateur.
  17. En raison de la nature distribuée de ce système, il évite de se connecter à des sites majeurs comme Facebook, Twitter, Google, etc. Tout individu peut posséder son propre domaine et donc agir comme son propre fournisseur d'identité.

Il ne s'agit pas strictement d'une «authentification par formulaire pour les sites Web». Mais c'est un effort pour passer de la norme actuelle d'authentification basée sur les formulaires à quelque chose de plus sûr: l'authentification prise en charge par le navigateur.

Charlie
la source
3
Le lien BrowserID est mort
Mehdi Bounya
Le projet semble avoir été mis en veilleuse .... voir en.wikipedia.org/wiki/Mozilla_Persona
Jeff Olson
138

Je pensais juste partager cette solution que je trouvais très bien.

Je l'appelle le champ factice (même si je n'ai pas inventé cela, alors ne me croyez pas).

En bref: il vous suffit de l'insérer dans votre <form>et de vérifier qu'il est vide lors de la validation:

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

L'astuce consiste à tromper un bot en lui faisant croire qu'il doit insérer des données dans un champ obligatoire, c'est pourquoi j'ai nommé l'entrée "e-mail". Si vous avez déjà un champ appelé e-mail que vous utilisez, vous devriez essayer de nommer le champ factice quelque chose d'autre comme "entreprise", "téléphone" ou "adresse e-mail". Choisissez simplement quelque chose dont vous savez que vous n'avez pas besoin et ce qui ressemble à quelque chose que les gens trouveraient normalement logique de remplir dans un formulaire Web. Maintenant cacher le inputchamp à l' aide CSS ou JavaScript / jQuery - tout ce que vous convient le mieux - il suffit de ne pas régler l'entrée typeà hiddenou bien le bot ne tombera pas pour elle.

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

Exemple:

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

Dans le cas d'un bot: le bot verra un champ dont le type est textet un nom email(ou quoi que vous l'appeliez) et tentera logiquement de le remplir avec les données appropriées. Peu importe si vous stylisez le formulaire de saisie avec du CSS sophistiqué, les développeurs Web le font tout le temps. Quelle que soit la valeur dans le champ fictif, nous ne nous en soucions pas tant qu'il est plus grand que les 0caractères.

J'ai utilisé cette méthode sur un livre d'or en combinaison avec CAPTCHA , et je n'ai pas vu un seul message de spam depuis. J'avais utilisé une solution uniquement CAPTCHA auparavant, mais finalement, cela a abouti à environ cinq messages de spam toutes les heures. L'ajout du champ factice dans le formulaire a arrêté (au moins jusqu'à présent) l'apparition de tous les spams.

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

Attention : Bien sûr, cette méthode n'est pas infaillible à 100%. Les robots peuvent être programmés pour ignorer les champs de saisie avec le style qui leur est display:noneappliqué. Vous devez également penser aux personnes qui utilisent une forme de saisie semi-automatique (comme la plupart des navigateurs ont intégré!) Pour remplir automatiquement tous les champs de formulaire pour eux. Ils pourraient tout aussi bien ramasser un champ factice.

Vous pouvez également varier cela un peu en laissant le champ factice visible mais en dehors des limites de l'écran, mais cela dépend entièrement de vous.

Sois créatif!

Pieter888
la source
33
C'est une astuce anti-spam utile, mais je suggérerais d'utiliser un nom de champ autre que `` e-mail '', ou vous pouvez trouver que le remplissage automatique du navigateur le remplit, bloquant par inadvertance les véritables utilisateurs de votre site.
Nico Burns
8
J'en ai également plusieurs autres à utiliser visibility:hiddenet position:absolute;top:-9000pxvous pouvez également le faire text-indentet également z-indexsur quelques-uns de ces éléments et les placer dans des noms de fichiers CSS compressés avec des noms maladroits - car les bots peuvent détecter 1 affichage: aucun` et ils vérifient maintenant une plage de combinaisons - j'utilise en fait ces méthodes et ce sont de vieilles astuces du métier. +1
TheBlackBenzKid
18
Que se passe-t-il lorsqu'un utilisateur ayant une déficience visuelle utilise un lecteur d'écran pour naviguer dans le formulaire?
soycharliente
8
Cette technique a un nom: le pot de miel en.wikipedia.org/wiki/Honeypot_(computing)
pixeline
27
Pas besoin de style en ligne. Ajoutez simplement une classe au champ (utilisez peut-être un mot étrange qui ne pourrait jamais signifier quoi que ce soit pour un bot) et cachez-le via le fichier CSS du site. Comme: <input type="text" name="email" class="cucaracha">et dans votre CSS: .cucaracha { display:none; }.
Ricardo Zea
81

Je ne pense pas que la réponse ci-dessus soit "fausse" mais il y a de grandes zones d'authentification qui ne sont pas abordées (ou plutôt l'accent est mis sur "comment mettre en œuvre des sessions de cookies", pas sur "quelles options sont disponibles et quel est le métier) -offs ".

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

  • Le problème réside plus dans la configuration du compte que dans la vérification des mots de passe.
  • L'utilisation de l'authentification à deux facteurs est beaucoup plus sûre que des moyens plus intelligents de cryptage des mots de passe
  • N'essayez PAS d'implémenter votre propre formulaire de connexion ou stockage de base de données de mots de passe, sauf si les données stockées sont sans valeur lors de la création du compte et auto-générées (c'est-à-dire de style Web 2.0 comme Facebook, Flickr , etc.)

    1. L'authentification Digest est une approche normalisée prise en charge par tous les principaux navigateurs et serveurs, qui n'enverra pas de mot de passe même sur un canal sécurisé.

Cela évite d'avoir besoin de "sessions" ou de cookies car le navigateur lui-même rechiffrera la communication à chaque fois. C'est l'approche de développement la plus "légère".

Cependant, je ne le recommande pas, sauf pour les services publics de faible valeur. Il s'agit d'un problème avec certaines des autres réponses ci-dessus - n'essayez pas de réimplémenter 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. N'utilisez pas de cookies. Ne stockez rien dans votre propre base de données roulée à la main. Il suffit de demander, par demande, si la demande est authentifiée. Tout le reste doit être pris en charge par la configuration et un logiciel tiers de confiance.

Donc ...

Premièrement, nous confondons la création initiale d'un compte (avec un mot de passe) avec la revérification du mot de passe par la suite. Si je suis Flickr et que je crée votre site pour la première fois, le nouvel utilisateur a accès à une valeur nulle (espace Web vide). Je m'en fiche vraiment si la personne qui crée le compte ment à propos de son nom. Si je crée un compte de l'intranet / extranet hospitalier, les mensonges de valeur dans tous les dossiers médicaux, et donc je fais attention sur l'identité (*) du créateur de compte.

C'est la partie très très difficile. La seule solution décente est un réseau 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 une clé publique, et les hachez tous avec la clé privée. Vous visitez ensuite l'hôpital et l'administrateur système examine votre passeport, voit si la photo vous correspond, puis hache la page Web / le hachage de photo avec la clé privée de l'hôpital. À partir de maintenant, nous pouvons échanger en toute sécurité des clés et des jetons. Tout comme quiconque fait confiance à l'hôpital (il y a la sauce secrète BTW). L'administrateur système peut également vous fournir un dongle RSA ou une autre authentification à deux facteurs.

Mais c'est beaucoup de tracas, et pas très web 2.0. Cependant, c'est le seul moyen sécurisé de créer de nouveaux comptes qui ont accès à des informations précieuses qui ne sont pas auto-créées.

  1. Kerberos et SPNEGO - mécanismes d'authentification unique avec un tiers de confiance - en gros, l'utilisateur vérifie par rapport à un tiers de confiance. (NB ce n'est en aucun cas le OAuth à ne pas faire confiance )

  2. SRP - sorte d'authentification de mot de passe intelligente sans tiers de confiance. Mais ici, nous entrons dans les domaines de "il est plus sûr d'utiliser l'authentification à deux facteurs, même si cela coûte plus cher"

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

En fin de compte, c'est un compromis - quel est le coût d'une violation de la sécurité par rapport au coût de la mise en œuvre d'approches plus sécurisées. Un jour, nous pourrions voir une PKI appropriée largement acceptée et donc plus de formulaires d'authentification et de bases de données roulés. Un jour...

vous cad monsieur - prenez cela
la source
29
Difficile de dire de quelle réponse vous parlez dans 'Je ne pense pas que la réponse ci-dessus soit "fausse"'
Davorak
55

Lors du hachage, n'utilisez pas d'algorithmes de hachage rapides tels que MD5 (de nombreuses implémentations matérielles existent). Utilisez quelque chose comme SHA-512. Pour les mots de passe, les hachages plus lents sont meilleurs.

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

josh
la source
5
SHA-512 est également rapide, vous avez donc besoin de milliers d'itérations.
Seun Osewa
5
"n'utilisez pas d'algorithmes de hachage rapides ... les hachages plus lents sont meilleurs" - Explication? Documentation?
one.beat.consumer
17
Explication: Plus vite vous pouvez créer des hachages, plus vite un vérificateur de force brute peut fonctionner. Des hachages plus lents ralentiront donc le forçage brut. Un algorithme de hachage lent rendra le forçage brut impossible pour les mots de passe plus longs (8 chiffres +)
NickG
6
Plus comme quelque chose comme bcrypt qui est conçu pour hacher lentement.
Fabian Nicollier
4
Comme mentionné dans une autre réponse, "OWASP recommande l'utilisation d'Argon2 comme premier choix pour les nouvelles applications. Si ce n'est pas disponible, PBKDF2 ou scrypt doivent être utilisés à la place. Et enfin, si aucune des options ci-dessus n'est disponible, utilisez bcrypt." Ni MD5 ni aucune des fonctions de hachage SHA ne doivent jamais être utilisées pour hacher des mots de passe. Cette réponse est un mauvais conseil.
Mike
51

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

blade19899
la source
25

Je voudrais 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 d'authentification et d'authentification pour les administrateurs que les utilisateurs réguliers. Vous pouvez avoir un formulaire de connexion distinct sur une URL distincte exécutant un code distinct pour les demandes qui accorderont des privilèges élevés. Celui-ci peut faire des choix qui seraient une douleur totale pour les utilisateurs réguliers. L'une de celles que j'ai utilisées consiste à brouiller l'URL de connexion pour l'accès administrateur et à envoyer à l'administrateur la nouvelle URL. Arrête immédiatement toute attaque par force brute car votre nouvelle URL peut être arbitrairement difficile (très longue chaîne aléatoire) mais le seul inconvénient de votre administrateur est de suivre un lien dans son e-mail. L'attaquant ne sait plus où même POSTER.

Iain Duncan
la source
Un simple lien dans un e-mail n'est pas réellement sécurisé, car l'e-mail n'est pas sécurisé.
David Spector
Il est aussi sûr que tout autre système de réinitialisation de mot de passe basé sur des jetons qui n'est pas à deux facteurs. Ce qui est presque tous.
Iain Duncan
17

Je ne sais pas s'il valait mieux y répondre comme réponse ou comme 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 une remarque sur les attaques de synchronisation.

Dans les formulaires Se souvenir de votre mot de passe , un attaquant pourrait potentiellement vérifier une liste complète des e-mails et détecter ceux qui sont enregistrés dans le système (voir le lien ci-dessous).

Concernant le formulaire de mot de passe oublié, j'ajouterais que c'est une bonne idée d'égaliser les temps entre les requêtes réussies et infructueuses avec une fonction de retard.

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

user9869932
la source
14

Je voudrais ajouter un commentaire très important: -

  • "Dans un cadre d' entreprise, intra- net", la plupart sinon la totalité de ce qui précède pourrait ne pas s'appliquer!

De nombreuses entreprises déploient des sites Web «à usage interne uniquement» qui sont, en fait, des «applications d'entreprise» qui ont été implémentées via des URL. Ces URL ne peuvent (soi-disant ...) être résolues qu'au sein du "réseau interne de l'entreprise". (Quel réseau comprend comme par magie tous les `` guerriers de la route '' connectés au VPN.)

Lorsqu'un utilisateur est consciencieusement connecté au réseau susmentionné, son identité ("authentification") est [déjà ... "" définitivement connue ", tout comme sa permission (" autorisation ") de faire certaines choses ... telles que. .. "pour accéder à ce site Web."

Ce 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 toute personne qui se retrouve légitimement sur votre site Web doit être accompagnée [d'une variable d'environnement contenant comme par magie ...] un "jeton". (C'est-à- dire que l'absence d'un tel jeton doit être un motif immédiat 404 Not Found.)

La valeur du jeton n'a aucun sens pour vous, mais, si besoin est, "des moyens appropriés existent" par lesquels votre site Web peut "[avec autorité] demander à quelqu'un qui connaît (LDAP ... etc.)" de tout et de tous (!) question que vous pourriez avoir. En d' autres termes, vous ne pas vous prévaloir d' une « logique INDIGENES maison. » Au lieu de cela, vous demandez à l'Autorité et faites implicitement confiance à son verdict.

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

Mike Robinson
la source
9
Vous êtes tombé bien dans la ponctuation quand vous étiez enfant? :) Je l'ai lu trois fois et je suis toujours perdu à quel point vous essayez de le faire. Mais si vous dites "Parfois, vous n'avez pas besoin d'une authentification basée sur un formulaire", vous avez raison. Mais étant donné que nous discutons quand nous en avons besoin, je ne vois pas pourquoi cela est très important à noter?
Hugo Delsing
1
Ce que je veux dire, c'est que le monde extérieur à une entreprise est entièrement différent du monde intérieur. Si vous construisez une application accessible au "wide web laineux" et destinée à la consommation générale par le public, vous n'avez pas d'autre choix que de lancer vos propres méthodes d'authentification et d'autorisation. Mais, au sein d'une entreprise, où le seul moyen d'y arriver est d'être là ou d'utiliser un VPN, il est très probable que l'application n'aura pas - ne doit pas avoir - "ses propres" méthodes pour faire ces choses. L'application doit utiliser ces méthodes à la place, pour fournir une gestion cohérente et centralisée.
Mike Robinson
2
Même les intranets nécessitent un minimum de sécurité dans le bâtiment. Les ventes ont des chiffres de profits et pertes confidentiels, tandis que l'ingénierie a une propriété intellectuelle confidentielle. De nombreuses entreprises restreignent les données sur les lignes départementales ou divisionnaires.
Sablefoste