web-dev-qa-db-fra.com

Vérification des chaînes pour un mot de passe suffisamment fort

Duplicata possible:
Expression de mot de passe fort
Besoin de RegEx pour la force du mot de passe?

Je me demandais simplement quelle serait la meilleure façon de rechercher une chaîne pour certains critères (la force du mot de passe pour être spécifique).

Jusqu'à présent, j'ai un simple:

if(password.Length <= 7)
    {
        errorMessage = "Your password must be at least 8 characters.";
    }

Je voudrais pouvoir vérifier les majuscules, mais je ne suis pas sûr de la méthode ou de la procédure. J'ai essayé Google, en recherchant le site Web: http://msdn.Microsoft.com , et en recherchant l'index de mon livre C # (Programmation C # 3E, par Barbara Doyle), mais je ne peux pas sembler pour en trouver.

Je sais que je pourrais essayer ça ...:

foreach(char c in password)
    {
        if(c!='A' || c!='B' || c!='C' || c!='D' ..... || c!='Z')
        {
            errorMessage = "Your password must contain at least one capital letter";
        }
    }

... Mais cela serait extrêmement bâclé et devrait être doublé pour rechercher au moins une lettre minuscule. Je suis sûr qu'il existe une meilleure façon de procéder, ou du moins un raccourci pour la méthode que j'ai montrée ci-dessus.

De plus, je peux décider de vérifier le mot de passe pour les caractères spéciaux (cela semble plus facile à faire dans l'exemple ci-dessus qu'avec les lettres majuscules et minuscules, donc je peux simplement l'utiliser pour les caractères spéciaux, si je décide de les rendre nécessaires). S'il existe un moyen facile (ou approprié) de le faire, j'aimerais aussi avoir cette connaissance.

Quoi qu'il en soit, merci beaucoup pour toute aide que n'importe qui peut apporter.

19
VoidKing

Je ne peux pas prendre le crédit, car je l'ai volé à ici

using System.Text;
using System.Text.RegularExpressions;

  public enum PasswordScore
  {
    Blank = 0,
    VeryWeak = 1,
    Weak = 2,
    Medium = 3,
    Strong = 4,
    VeryStrong = 5
  }

  public class PasswordAdvisor
  {
    public static PasswordScore CheckStrength(string password)
    {
      int score = 0;

      if (password.Length < 1)
        return PasswordScore.Blank;
      if (password.Length < 4)
        return PasswordScore.VeryWeak;

      if (password.Length >= 8)
        score++;
      if (password.Length >= 12)
        score++;
      if (Regex.Match(password, @"/\d+/", RegexOptions.ECMAScript).Success)
        score++;
      if (Regex.Match(password, @"/[a-z]/", RegexOptions.ECMAScript).Success &&
        Regex.Match(password, @"/[A-Z]/", RegexOptions.ECMAScript).Success)
        score++;
      if (Regex.Match(password, @"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript).Success)
        score++;

      return (PasswordScore)score;
    }
  }

Notez l'utilisation de l'expression régulière pour vérifier les caractères majuscules. Cela semble être une approche décente, car elle vérifie la longueur, l'utilisation des caractères majuscules et minuscules, les chiffres et les caractères spéciaux.

** Mettre à jour **

Je sais que la question est maintenant fermée, mais je peux ajouter plus d'explications pour que VoidKing comprenne certains des concepts.

Un PasswordScore est renvoyé à partir de la méthode CheckStrength, qui peut être utilisée comme condition pour la prochaine étape de votre code.

Voici une démonstration non testée de la façon dont le code ci-dessus pourrait être utilisé:

String password = "MyDummy_Password"; // Substitute with the user input string
PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(password);

switch (passwordStrengthScore) {
    case PasswordScore.Blank:
    case PasswordScore.VeryWeak:
    case PasswordScore.Weak:
            // Show an error message to the user
            break;
    case PasswordScore.Medium:
    case PasswordScore.Strong:
    case PasswordScore.VeryStrong:
           // Password deemed strong enough, allow user to be added to database etc
           break;
}

Les énumérations sont utilisées dans ce cas comme moyen de classer la force du mot de passe en groupes lisibles par l'homme. Maintient le code propre et rend évident ce qui se passe dans le code.

En ce qui concerne l'utilisation des Regex, si vous n'êtes pas familier avec leur concept et comment et quand les utiliser, je suggère de faire quelques recherches car celles-ci peuvent être utiles dans de nombreux scénarios différents pour vérifier les modèles dans les chaînes. Peut-être commencer ici .

60
Steve Kennaird