Active Directory密码的正则表达式

本文关键字:正则表达式 密码 Directory Active | 更新日期: 2023-09-27 18:19:50

想与社区确认并分享我的想法。。

Active Directory密码的正则表达式应验证密码

  1. 长度至少为六个字符
  2. 包含英文大写字符(A到Z)
  3. 包含英文小写字符(a到z)
  4. 包含基数为10的数字(0到9)
  5. 包含非字母字符(!、$、#、%…)
  6. 不包含用户的帐户名或用户全名中超过两个连续字符的部分

前5个条件很简单。

我发现这应该为1-5个条件做工作:

(?=^.{8,255}$)((?=.*'d)(?=.*[A-Z])(?=.*[a-z])|(?=.*'d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*'d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*

但是如何添加条件6—否定名称和登录?

我是这样看的:

首先获得被禁止的东西:

String enter = fullname + login;
List<string> Negative = new List<string>();
for (int i = 0; i < enter.Length; i += 3)
{
    if (i + 3 > enter.Length)
    {
        enter.Substring(i, 3);
        Negative.Add(enter.Substring(i, 3));
    }
}

然后构建正则表达式:

StringBuilder pattern = new StringBuilder("(?=^.{8,255}$)((?=.*'d)(?=.*[A-Z])(?=.*[a-z])|(?=.*'d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*'d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))");
foreach(string word in Negative)
{
    pattern.Append("(/^((?!" + word + @")['s'S])*$/)");
}
pattern.Append("^.*");

该模式现在应该是所需的正则表达式。

我主要关心的是这行代码:

pattern.Append("(/^((?!" + word + @")['s'S])*$/)");

它会为word添加否定条件吗?

Active Directory密码的正则表达式

正则表达式是一个很好的工具,但不能解决所有问题。例如,正则表达式不能按您的要求计算。是的,正则表达式可以计算例如连续的字母,但它不能检查您是否有其中两个字母和其他三个字母分布在整个输入字符串中。这也适用于您的具体问题。具体来说,在同一个正则表达式中检查这两个不同的条件可能会变得非常困难。

在这种情况下,我建议不要使用正则表达式,只编写一个执行所有检查的小算法。这种方法的另一个优点是,当普通人稍后重新访问时,他们将能够理解你的算法。这总是一个额外的好处。

您的第5个和第1个需求将生成此regex

^.{6,}$

对于您的第6项要求,

考虑到您的帐户名为accountName

input是您的目标输入密码

bool isNotValid= Regex.Matches(accountName,"(?=(..))")//capturing two consecutive characters of account name
                      .Cast<Match>()
                      .Select(m=>m.Groups[1].Value)//two consecutive character's list
                      .Any(y=>input.IndexOf(y)!=-1);

捕获两个连续字符等同于捕获两个以上的连续字符

我已经使用(?=(..))捕获了两个连续的字符。这将从hello捕获heellllo