【问题标题】:Checking strings for a strong enough password [duplicate]检查字符串是否有足够强的密码[重复]
【发布时间】:2012-10-05 16:16:15
【问题描述】:

可能重复:
Strong password regex
Need RegEx for password strength?

我只是想知道在字符串中搜索某些条件(具体来说是密码强度)的最佳方法是什么。

到目前为止,我有一个简单的:

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

我希望能够检查大写字母,但我不确定方法或程序是什么。我试过谷歌搜索,搜索网站:http://msdn.microsoft.com,并搜索我的 C# 书籍(C# Programming 3E,Barbara Doyle)的索引,但我似乎找不到任何东西。

我知道我可以试试这个...:

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";
        }
    }

...但这会非常草率,并且必须加倍才能检查至少一个小写字母。我确信有更好的方法来做到这一点,或者至少是我上面显示的方法的简写。

另外,我可能会决定检查特殊字符的密码(在上面的示例中似乎比使用大小写字母更容易,所以我可以将它用于特殊字符,如果我决定让它们成为必要的话) .如果有一种简单(或适当)的方法可以做到这一点,我也很想拥有这些知识。

无论如何,非常感谢您提供的任何帮助。

【问题讨论】:

  • 这不是答案,但请确保您了解xkcd.com/936xkcd.com/792 我还建议您阅读codinghorror.com/blog/2010/12/… 并在Jeff 的网站上搜索其他相关文章。然后查看正则表达式以验证适当的长度/复杂性。
  • 您可能希望通过正则表达式运行密码,而不是一系列if...then 子句。看看这个SO answer。我认为它提供了可以帮助您的正则表达式。
  • @DarinDimitrov 嘿,谢谢你,我没有看到那个链接,因为我不知道搜索正则表达式(虽然,我想这很明显)。我很抱歉,谢谢链接!
  • 我非常不同意通过仅引用询问正则表达式的问题来关闭此问题作为重复问题的决定。 OP 没有明确要求正则表达式的答案,有些人可能不会发现使用正则表达式是“最佳”答案,因为不是每个人都能轻松理解正则表达式。

标签: c# string razor passwords webmatrix


【解决方案1】:

我不能相信,因为我从here偷了这个

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;
    }
  }

注意使用正则表达式检查大写字符。 这似乎是一种不错的方法,因为它会检查长度、大小写字符的使用、数字和特殊字符。

** 更新**

我知道问题现已结束,但我可以为 VoidKing 添加更多解释以了解一些概念。

从 CheckStrength 方法返回的 PasswordScore 可用作代码中下一步操作的条件。

以下是如何使用上述代码的未经测试的演示:

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;
}

在这种情况下,枚举被用作将密码强度分类为人类可读组的一种方法。保持代码整洁,并让代码中发生的事情一目了然。

关于 Regex 的使用,如果您不熟悉它们的概念以及如何以及何时使用它们,我建议您进行一些研究,因为这些对于检查字符串中的模式在许多不同的场景中都很有用。也许开始here

【讨论】:

  • 密码为Password@123 将产生PasswordScore6,这在enum 中没有定义。所以分数必须从 0 开始,才能让它的功能更可靠。
  • 我必须去掉尾随/前导的“/”才能让它工作。
  • @SumitGupta 实际上缺少enum 值,分数必须从1 开始,否则password.Length &lt; 4password.Length &gt;= 8 都将返回PasswordScore.VeryWeak 的值。我添加了值PasswordScore.TooShort = 1,如果password.Length &lt; 4 则返回此值。所有其他enum 值必须加一。我用我的修复编辑了答案
  • 我“试图”用我的修复来编辑答案,但它似乎被拒绝了:(如果你复制/粘贴代码,请阅读我上面的评论
  • @JPelletier 我不确定 >=8 非常弱是一个问题,但是密码长度 5,6 和 7 返回“空白”肯定存在问题(如果它们没有其他品质)
猜你喜欢
  • 1970-01-01
  • 2016-01-15
  • 2023-03-31
  • 2017-05-21
  • 2013-05-23
  • 2019-01-24
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多