web-dev-qa-db-fra.com

Référence - Validation du mot de passe

Très souvent, les questions (en particulier celles marquées regex ) demandent des moyens de valider les mots de passe. Il semble que les utilisateurs recherchent généralement des méthodes de validation de mot de passe qui consistent à s'assurer qu'un mot de passe contient des caractères spécifiques, correspond à un modèle spécifique et/ou obéit à un nombre de caractères minimum. Ce message est destiné à aider les utilisateurs à trouver des méthodes appropriées pour la validation de mot de passe sans diminuer considérablement la sécurité.

La question est donc la suivante: comment valider correctement les mots de passe?

30
ctwheels

Dilbert comic strip for Mordac, the preventer of information services

Pourquoi les règles de validation des mots de passe sont mauvaises?

Notre propre Jeff Atwood (blogueur de Coding Horror et co-fondateur de Stack Overflow et Stack Exchange) a écrit un blog sur les règles de mot de passe en mars 2017 intitulé Les règles de mot de passe sont des conneries =. Si vous n'avez pas lu ce post, je vous exhorte à le faire car il reflète grandement l'intention de ce post.

Si vous n'avez jamais entendu parler de NIST (National Institute of Standards and Technology) , alors vous n'utilisez probablement pas les bonnes méthodes de cybersécurité pour vos projets. Dans ce cas, veuillez consulter leurs Digital Identity Guidelines . Vous devez également rester à jour sur les meilleures pratiques en matière de cybersécurité. Publication spéciale NIST 800-63B (révision 3) mentionne ce qui suit au sujet des règles de mot de passe:

Les vérificateurs NE DEVRAIENT PAS imposer d'autres règles de composition (par exemple, exiger des mélanges de différents types de caractères ou interdire les caractères répétés consécutivement) pour les secrets mémorisés.

Même la documentation de Mozilla sur Validation des données de formulaire se moque des règles de mot de passe ( archive de page ici ):

"Votre mot de passe doit comporter entre 8 et 30 caractères et contenir une lettre majuscule, un symbole et un chiffre" (sérieusement?)

Que se passe-t-il si vous imposez des règles de composition à vos mots de passe? Vous êtes limitant le nombre de mots de passe potentiels et supprimez les permutations de mot de passe qui ne correspondent pas à vos règles. Cela permet aux pirates de s'assurer que leurs attaques font de même! "Ya mais il y a comme un quadrillion (1 000 000 000 000 000 ou 1 x 1015) permutations de mot de passe ": n cluster de 25 GPU fissure chaque mot de passe Windows standard en <6 heures (958 = 6 634 204 312 890 625 ~ 6,6 x 1015 mots de passe).

xkcd Ce post sur la sécurité StackExchange étend la bande dessinée XKCD ci-dessus.

Comment valider les mots de passe?

1. Ne créez pas votre propre authentification

Cesser complètement d'exiger des mots de passe , et permettre aux gens de se connecter avec Google, Facebook, Twitter, Yahoo ou toute autre forme valide de permis de conduire Internet avec lequel vous êtes à l'aise. Le meilleur mot de passe est celui que vous n'avez pas à stocker .

Source: Votre mot de passe est trop court par Jeff Atwood.

2. Création de votre propre authentification

Si vous le devez vraiment créez vos propres méthodes d'authentification, suivez au moins les méthodes éprouvées de cybersécurité. Les deux sections suivantes (2.1 et 2.2) sont tirées de la publication actuelle du NIST , section 5.1.1.2 Vérificateurs secrets mémorisés .

2.1. Suivez les méthodes de cybersécurité PROUVÉES

Le NIST indique que vous [~ # ~] devez [~ # ~] :

  • Exiger que les secrets mémorisés choisis par l'abonné aient au moins 8 caractères.
    • Jeff Atwood propose que les mots de passe soient composés d'au moins 10 caractères pour les utilisateurs normaux et d'au moins 15 caractères pour les utilisateurs disposant de privilèges plus élevés (c'est-à-dire les administrateurs et les modérateurs).
  • Autoriser les secrets mémorisés choisis par l'abonné jusqu'à 64 caractères ou plus.
    • Idéalement, vous ne devriez même pas mettre une limite supérieure à cela.
  • Autoriser toutes les impressions ASCII (y compris le caractère espace) et Unicode.
    • Aux fins des exigences de longueur, chaque point de code Unicode DOIT être compté comme un seul caractère.
  • Comparez les secrets potentiels avec une liste contenant des valeurs connues pour être couramment utilisées, attendues ou compromises. Par exemple:
    • Mots de passe obtenus à partir de corpus de violation précédents.
    • Mots du dictionnaire.
    • Caractères répétitifs ou séquentiels (par exemple aaaaaa, 1234abcd)
    • Mots spécifiques au contexte, tels que le nom du service, le nom d'utilisateur et ses dérivés.
  • Offrez des conseils à l'abonné, comme un compteur de force de mot de passe.
  • Implémentez un mécanisme de limitation de débit qui limite efficacement le nombre de tentatives d'authentification infructueuses qui peuvent être effectuées sur le compte de l'abonné (voir Limitation de débit (limitation) ).
  • Forcer un changement s'il existe des preuves de compromission de l'authentificateur.
  • Autoriser les demandeurs à utiliser la fonctionnalité coller lors de la saisie d'un secret mémorisé (facilite l'utilisation de gestionnaires de mots de passe, ce qui augmente généralement la probabilité que les utilisateurs choisissent des secrets mémorisés plus forts).

2.2. N'UTILISEZ AUCUNE des méthodes de cette section!

La même publication indique également que vous NE DEVRIEZ PAS :

  • Tronquez le secret.
  • Autoriser l'abonné à stocker un indice accessible à un demandeur non authentifié.
  • Invitez les abonnés à utiliser des types d'informations spécifiques (par exemple, "Quel était le nom de votre premier animal de compagnie?") Lors du choix des secrets mémorisés.
  • Imposer d'autres règles de composition (par exemple, exiger des mélanges de différents types de caractères ou interdire les caractères répétés consécutivement) pour les secrets mémorisés.
  • Exiger que les secrets mémorisés soient modifiés arbitrairement (par exemple périodiquement).

Il existe une pléthore de sites Web expliquant comment créer des formulaires de validation de mot de passe "approprié": la majorité d'entre eux sont obsolètes et ne doivent pas être utilisés.

3. Utilisation de l'entropie par mot de passe

Avant de continuer à lire cette section, veuillez noter que l'intention de cette section n'est pas de vous donner les outils nécessaires pour déployer votre propre schéma de sécurité , mais plutôt pour vous donner des informations sur comment les méthodes de sécurité actuelles valider les mots de passe. Si vous envisagez de créer votre propre système de sécurité, vous devriez vraiment réfléchir trois fois et lire cet article de la communauté de sécurité de StackExchange.

3.1. Présentation de l'entropie des mots de passe

Au niveau le plus élémentaire, l'entropie des mots de passe peut être calculée à l'aide de la formule suivante:

E = log2(R^L)

Dans la formule ci-dessus:

  • E représente l'entropie du mot de passe
  • R est le nombre de caractères dans le pool de caractères uniques
  • L est le nombre de caractères du mot de passe

Cela signifie que R^L représente le nombre de mots de passe possibles; ou, en termes d'entropie, le nombre de tentatives nécessaires pour épuiser toutes les possibilités.

Malheureusement, ce que cette formule ne prend pas en compte, ce sont des choses telles que:

  • Mots de passe génériques: c'est-à-dire Password1, admin
  • Noms: c'est-à-dire John, Mary
  • Mots couramment utilisés: c'est-à-dire dans la langue anglaise the, I
  • Mots inversés/inversés: c'est-à-dire drowssap (mot de passe en arrière)
  • Substitution de lettres (aka leet): c'est-à-dire P@$$w0rd

L'ajout de logique pour ces considérations supplémentaires présente un défi de taille. Voir 3.2 pour les packages existants que vous pouvez ajouter à vos projets.

3.2. Projets existants d'entropie de mot de passe

Au moment d'écrire ces lignes, la bibliothèque existante la plus connue pour estimer la force des mots de passe est zxcvbn by Dropbox (un projet open-source sur GitHub). Il a été adapté pour prendre en charge . Netangularjscc #c ++allerJavajavascriptobjective-cocamlphppythonreposrubisrouillescala


Le faire dans le mauvais sens

Je comprends, cependant, que tout le monde a des exigences différentes et que parfois les gens veulent faire les choses de la mauvaise façon. Pour ceux d'entre vous qui correspondent à ce critère (ou qui n'ont pas le choix et qui ont tout présenté au-dessus de cette section et plus à votre responsable mais qui refusent de mettre à jour leurs méthodes), autorisez au moins les caractères Unicode. Au moment où vous limitez les caractères du mot de passe à un ensemble spécifique de caractères (c'est-à-dire en veillant à ce qu'un caractère minuscule ASCII existe a-z Ou en spécifiant les caractères que l'utilisateur peut ou ne peut pas saisir la fonction !@#$%^&*()), vous demandez juste des ennuis!

P.S. Ne faites jamais confiance à la validation côté client car elle peut très facilement être désactivée. Cela signifie pour ceux d'entre vous qui essaient de valider les mots de passe en utilisant javascript [~ # ~] arrêter [~ # ~] . Voir JavaScript: côté client vs côté serveur pour plus d'informations.

Le modèle d'expression régulière suivant ne fonctionne pas dans tous les langages de programmation, mais il le fait dans la plupart des langages de programmation principaux ( Java. Netphp - PerlRuby ). Veuillez noter que l'expression régulière suivante peut ne pas fonctionner dans votre langue (ou même dans la version linguistique) et vous devrez peut-être utiliser des alternatives (c'est-à-dire python : voir l'expression régulière Python correspondant aux propriétés Unicode ) . Certains langages de programmation ont même de meilleures méthodes pour vérifier ce genre de chose (c'est-à-dire en utilisant Password Validation Plugin pour mysql ) au lieu de réinventer la roue. En utilisant node.js , ce qui suit est valide si vous utilisez XRegExp addon ou un autre outil de conversion pour les classes Unicode comme expliqué dans Javascript + reicxes Unicode .

Si vous besoin pour empêcher la saisie de caractères de contrôle, vous pouvez demander à l'utilisateur quand une correspondance d'expression régulière se produit en utilisant le modèle [^\P{C}\s]. Cela correspondra UNIQUEMENT aux caractères de contrôle qui ne sont pas également des espaces blancs - c'est-à-dire tabulation horizontale, saut de ligne, tabulation verticale.

L'expression régulière suivante garantit qu'il existe au moins un minuscule, une majuscule, un nombre et un symbole dans un mot de passe de 8 caractères ou plus:

^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=\P{N}*\p{N})(?=[\p{L}\p{N}]*[^\p{L}\p{N}])[\s\S]{8,}$
  • ^ Affirmez votre position au début de la ligne.
  • (?=\P{Ll}*\p{Ll}) Assurez-vous qu'il existe au moins une lettre minuscule (dans n'importe quel script).
  • (?=\P{Lu}*\p{Lu}) Assurez-vous qu'il existe au moins une lettre majuscule (dans n'importe quel script).
  • (?=\P{N}*\p{N}) Assurez-vous qu'il existe au moins un caractère numérique (dans n'importe quel script).
  • (?=[\p{L}\p{N}]*[^\p{L}\p{N}]) Assurez-vous qu'il existe au moins un caractère (dans n'importe quel script) qui n'est pas une lettre ou un chiffre.
  • [\s\S]{8,} Correspond à tout caractère 8 fois ou plus.
  • $ Affirmez la position à la fin de la ligne.

Veuillez utiliser l'expression régulière ci-dessus à votre propre discrétion. Tu étais prévenu!

58
ctwheels