6
votes

Reg expression requise pour un mot de passe fort

Quelqu'un pourrait-il m'aider avec une regex pour un mot de passe avec ce qui suit s'il vous plaît.

Incluez au moins deux des éléments suivants:

une lettre minuscule
une lettre majuscule
un nombre
Un «caractère spécial» (par exemple £, $, &, #)


8 commentaires

au moins deux des éléments suivants signifie qu'un mot de passe avec deux lettres minuscules et deux lettres majuscules est valide (sans chiffres, etc.) est valide?


Look ici ou ici ou peut-être même ici .


Désolé, le mot de passe doit contenir 2 des 4 groupes de caractères, c'est-à-dire une lettre minuscule et un nombre ou une lettre majuscule et un nombre, etc.


Une regex n'est probablement pas le bon outil de ce travail. La meilleure regex que je puisse penser pour cela serait une alternance de 12 possibilités distinctes: minuscule suivi de majuscules, majuscules suivies de minuscules, minuscules suivies d'un nombre, etc. et vous devez définir ce qu'un "caractère spécial" est. Il serait plus facile d'écrire du code pour boucler sur les caractères du mot de passe et conserver les comptes de chaque classe.


@Johnbanks Quel langage de programmation utilisez-vous?


@Ocar .NET 4 MVC - J'ai ce genre de travail en JS (? =. * \ D) (? =. * [AZ]) | (? =. * \ D) (? =. * [Az]) | (? =. * \ d) (? =. * [^ a-za-z0-9]) | (? =. * [AZ]) (? =. * [AZ]) | ( ? =. * [AZ]) (? =. * [^ A-ZA-Z0-9]) | (? =. * [AZ]) (? =. * [^ A-za -z0-9])) ^. * mais échoue dans l'attribut MVC Regex


Bien que ce ne soit pas regex, il y a un algorithme de mot de passe JavaScript au bas de cette JS qui peut être utile à afficher dans le navigateur et / ou à convertir en une autre langue: github.com/nak5ive/form.passwordstrength/blob/master/source/ ...


Je ne pense pas que cette question soit une duplication. L'OP veut avoir au moins 2 de l'exigences 4 !


3 Réponses :


4
votes

Les éléments suivants doivent fonctionner: xxx

exemple: http: // www.rubular.com/r/effmvehdx

Le lookahead négatif au début fera échouer si la chaîne entière est composée entièrement d'un seul groupe.

Notez que même si cela correspond à vos besoins, ce n'est pas une très bonne regex pour un mot de passe fort. Vous voulez probablement aussi une vérification de la longueur et vous voudrez peut-être avoir besoin d'au moins trois de ces groupes au lieu de deux.


3 commentaires

hmm .. je manque quelque chose ici? Incluez au moins deux des éléments suivants ... Cela signifie que abcabc ou ABC123 doit être valide.


@Carmaderos: Oui, et ils sont. Où est le problème?


Je suis désolé. Je testais avec le logiciel RAD Software Concepteur d'expression régulier, et cela ne correspondait pas. Je l'ai testé avec C # et travaillé. Pourriez-vous modifier votre question pour que je puisse supprimer mon bowvote?



0
votes

Comme je l'ai dit dans un commentaire, une regex n'est certainement pas le bon outil de ce travail. Il sera beaucoup plus facile d'écrire un certain code qui compte sur les caractères du mot de passe, en comptant le nombre de caractères de chaque classe.

Vous n'avez pas défini ce qu'est un "caractère spécial". Je suppose que cela signifie n'importe quel caractère autre qu'une lettre ou un chiffre (qui comprendrait des espaces et des caractères de contrôle). Je suppose également que les "lettres" désignent uniquement les 26 lettres de l'alphabet anglais - ce qui signifie qu'une lettre non anglaise comme à ± est un caractère spécial.

Pour prendre un exemple plus simple, les regexes ne sont pas très bons pour exprimer des choses comme "foo et bar dans l'un ou l'autre ordre"; Vous devez spécifier les deux ordre explicitement: xxx

Dans ce cas, vous avez besoin de 12 choix différents. Je pense que c'est correct, mais je ne l'ai pas testé. xxx

Il s'agit d'une regex de style Egrep ou de style Perl. grep ne reconnaît pas | par défaut; Si vous avez besoin d'un grep -style regexp, remplacez chaque | par \ | .

et si les exigences changent, Dites nécessitant au moins 3 classes de caractères sur 5 sur 5, vous devrez réécrire complètement la regex; Vous ne pouvez pas simplement le modifier.

Notez que vos exigences permettent toujours aa .


0 commentaires

1
votes

Alors que Keith Thompson a dit dans un commentaire, je ne pense pas qu'une seule regex vaut ici.

Le code suivant fera ce que vous voulez, et je pense qu'il est plus lisible, maintenu et plus facile à prouver l'exactitude qu'une seule expression régulière: xxx


1 commentaires

Merci à tout le monde, j'ai créé une suggestion de validationAttribute et d'Oscar d'occasion.