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?
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).
Ce post sur la sécurité StackExchange étend la bande dessinée XKCD ci-dessus.
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.
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 .
Le NIST indique que vous [~ # ~] devez [~ # ~] :
aaaaaa
, 1234abcd
)La même publication indique également que vous NE DEVRIEZ PAS :
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.
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.
Au niveau le plus élémentaire, l'entropie des mots de passe peut être calculée à l'aide de la formule suivante:
Dans la formule ci-dessus:
Cela signifie que 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:
Password1
, admin
John
, Mary
the
, I
drowssap
(mot de passe en arrière)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.
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
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!