密码验证的正则表达式

60

我目前使用此正则表达式来检查字符串是否符合一些条件。

这些条件是:字符串长度必须在8到15个字符之间;字符串中必须包含至少一个数字;字符串中必须包含至少一个大写字母;字符串中必须包含至少一个小写字母。

(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{8,15})$

它基本上工作良好,但不允许特殊字符。如果需要修改此正则表达式以允许特殊字符,请帮忙修改。谢谢!


15
我希望人们停止对密码施加愚蠢的限制。这让人感到烦恼,同时也降低了密码的安全性。 - Oliver Charlesworth
5
如果您不强制执行此类限制,大多数用户倾向于创建非常简单且很容易被破解的密码 :)。 - desi
2
@Oli 我基本上同意,但我认为8个字符的最小限制是有效的约束条件。整个大写/小写/数字/特殊/长子限制有点过头了。 - josh.trow
2
@desi:但是通过这种方式强制要求,最终会导致人们创建无法记忆的密码,于是他们会把它们写在某个地方。 - Oliver Charlesworth
5
@Oli:社交工程一直是个问题。如果密码没有任何限制,你可以将相关名称等放在你的密码列表顶部进行检查;在其他情况下,你至少需要有物理接触来找到存储密码的纸条、钱包等。总的来说,包含合理限制的密码(例如,多个字符类)比没有限制的密码更安全。我同意,它们也不完美,但实际上,什么是完美的呢? - Daniel Hilgarth
显示剩余6条评论
12个回答

0

符合以下标准的密码模式:

  1. 密码长度为8到15个字符
  2. 需要独特的字符
  3. 需要数字
  4. 需要小写字母
  5. 需要大写字母
^(?!.*([A-Za-z0-9]))(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,15}$

这与问题要求不符。 (?!.*([A-Za-z0-9])\1{1}) 片段阻止任何连续重复字符,这在您的标准中没有提到,实际上降低了密码的安全性。您还没有强制执行15个字符的最大长度。一个不太重要的细节:{1} 是多余的,所有 .*? 量词符号中的 ? 也是如此。 .*? 可以具有不同于 .* 的含义,但在此上下文中不是这样。 - Justin Morgan

0
根据Nicholas Carey的回答,我只是稍微优化了一下,采用了“快速失败”原则,而没有采用Justin Morgan提供的不必要的迭代。
public static class Utility
{
    public const int MinimumAllowedPasswordLength = 6;
    public const int MaximumAllowedPasswordLength = 32;

    public static bool IsPasswordValid(string? password)
    {
        if (password is null)
            return false;

        int passwordLength = password.Length;
        if (passwordLength < MinimumAllowedPasswordLength || passwordLength > MaximumAllowedPasswordLength)
            return false;

        bool hasUpperCaseLetter = false;
        bool hasLowerCaseLetter = false;
        bool hasDecimalDigit = false;

        for (int i = 0; i < passwordLength; i++)
        {
            var charAtIndex = password[i];

            if (!hasLowerCaseLetter && char.IsLower(charAtIndex)) hasLowerCaseLetter = true;
            else if (!hasUpperCaseLetter && char.IsUpper(charAtIndex)) hasUpperCaseLetter = true;
            else if (!hasDecimalDigit && char.IsDigit(charAtIndex)) hasDecimalDigit = true;

            if (hasLowerCaseLetter && hasUpperCaseLetter && hasDecimalDigit)
                return true;
        }

        return false;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接