10
votes

Regex correspond à un mot de passe fort avec deux caractères spéciaux ou plus

J'ai besoin de reportez-vous à un champ de mot de passe à l'aide de JavaScript avec les conditions suivantes:

  • au moins 15 caractères li>
  • Deux lettres minuscules ou plus li>
  • Deux lettres majuscules ou plus li>
  • Deux chiffres ou plus li>
  • Deux ou plusieurs des caractères spéciaux suivants :! @ # $% ^ & * - li> ul>

    J'ai une regex qui prend soin de la plupart des cas: p> xxx pré>

    Le problème ici est avec les symboles, cela fonctionne avec: p>

    @@Pssw0rdPssw0rd
    


8 commentaires

Je pense que cela ne peut pas être fait avec une regex.


@Salman: Pourquoi pas? Avez-vous déjà entendu parler de Lookaheads?


Je recommande de faire cela. La sécurité de mot de passe appliquée est l'une des principales raisons des utilisateurs créant un "mot de passe1" ou "mot de passe! @ 12345" dans votre cas.


Je parie "C'est mon mot de passe et vous ne serrez pas la force de la force à tout moment. Il est facile de se souvenir, mais difficile à craquer." est plus fort que "mot de passe! @ 12345" et cela ne répond pas à ces exigences.


@Martinho Fernandes: Nope. va rechercher :)


Il y a quelques fonctionnalités supplémentaires que j'ai laissées par ici qui n'affecte pas la regex. Il existe des contrôles supplémentaires au niveau de DB pour vous assurer que le mot de passe ne contient pas de valeurs de dictionnaire, de votre nom d'utilisateur, de tous les numéros liés à vos informations, etc.


@Yorick, je pense que avec des utilisateurs que paresseux si vous ne imposez-vous la sécurité de mot de passe, ils choisiront probablement quelque chose comme p (j'ai vu cela)


Je préfère casser les différentes conditions dans les étapes du code plutôt que par une regex complexe. De cette façon, vous pouvez signaler à l'utilisateur pourquoi leur mot de passe a échoué la validation de la sécurité. Également plus facile de vérifier que cela fonctionne réellement.


3 Réponses :


17
votes
(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){2})

4 commentaires

Testé et confirmé avec 100 000 mots de passe créés au hasard. Vous êtes un regex jedi, merci!


J'aimerais ajouter que cette regex fonctionne multi-plate-forme, mais si vous utilisez-le dans JavaScript, il ne fonctionnera pas dans IE7 en raison du problème de lookahead dans le moteur JavaScript. Lien


Pourquoi ne vous laisseront-ils pas supprimer des commentaires ??


Cette réponse est criminellement votée. En effet, vous êtes une regex jedi, merci! " @kennytm



3
votes

Je ne suis pas sûr qu'un seul réégycle est le moyen d'aller pour ce test.

Personnellement, je voudrais en mettre en œuvre quelque chose comme ceci: (Traitez comme pseudo code, je ne l'ai pas testé) xxx


1 commentaires

J'aime votre pensée, mais j'ai besoin de regex, car cela fonctionne dans plusieurs langues, une réutilisation de code plus facile était une clé pour moi.



0
votes

Il y a déjà de bonnes explications, alors je suis juste en train de piller ...

/ ^
(? =. {15})
(? = (?:. * [[[: Basse:]]) {2})
(? = (?:. * [[[[: Upper:]]]) {2})
(? = (?:. * [[[[: chiffre:]]]) {2})
(? = (?:. * * [! @ # $%% ^ & * -]) {2})
/ x


0 commentaires