.NET正则表达式来创建强密码

.NET正则表达式来创建强密码,.net,regex,.net,Regex,下面是我用来创建强密码的.NET正则表达式(这不符合我的项目密码要求): 密码要求: (?=^.{15,25}$)(\d{2,}[a-z]{2,}[A-Z]{2,}[!@#$%&+~?]{2,}) 最少15个字符(最多25个) 两个数字 两个大写字母 两个小写字母 两个特殊字符!@$%&+~ 它们不需要彼此相邻&按照我粘贴的正则表达式所要求的特定顺序 上面的正则表达式需要这样的密码:12abCD@QWertyP 它要求他们在具体的顺序,在重新。。。这不是我想要的 这应该通过一个格式正确

下面是我用来创建强密码的.NET正则表达式(这不符合我的项目密码要求):

密码要求:

(?=^.{15,25}$)(\d{2,}[a-z]{2,}[A-Z]{2,}[!@#$%&+~?]{2,})
  • 最少15个字符(最多25个)
  • 两个数字
  • 两个大写字母
  • 两个小写字母
  • 两个特殊字符
    !@$%&+~
  • 它们不需要彼此相邻&按照我粘贴的正则表达式所要求的特定顺序

    上面的正则表达式需要这样的密码:12abCD@QWertyP

    它要求他们在具体的顺序,在重新。。。这不是我想要的

    这应该通过一个格式正确的RE,符合上面列出的规格:Qq1W!w2Ee#3Rr4@Tt5

    我怎样才能消除他们彼此相依相依的必要性??
    显然,如果用户选择,密码应该是随机的。

    我认为您要寻找的不仅仅是正则表达式的设计功能

    考虑这样一个C#/VB方法:

    bool IsStrongPassword( String password )
    {
        int upperCount = 0;
        int lowerCount = 0;
        int digitCount = 0;
        int symbolCount = 0;
    
        for ( int i = 0; i < password.Length; i++ )
        {
            if ( Char.IsUpper( password[ i ] ) )
                upperCount++;
            else if ( Char.IsLetter( password[ i ] ) )
                lowerCount++;
            else if ( Char.IsDigit( password[ i ] ) )
                digitCount++;
            else if ( Char.IsSymbol( password[ i ] ) )
                symbolCount++;
        }
    
        return password.Length >= 15 && upperCount >= 2 && lowerCount >= 2 && digitCount >= 2 && symbolCount >= 2;
    }
    
    bool-IsStrongPassword(字符串密码)
    {
    整数上限=0;
    int lowerCount=0;
    int-digitCount=0;
    int symbolCount=0;
    for(int i=0;i=15&&upperCount>=2&&lowerCount>=2&&digitCount>=2&&symbolCount>=2;
    }
    
    据我所知,您不能合理地这样做,这意味着您必须在正则表达式中列出所有可能的顺序组合,这将增加到24个组合

    我会做4个单独的检查:

    • \d{2,}
    • [a-z]{2,}
    • [A-Z]{2,}
    • [!@$%&+~?]{2,}
    相关问题:


    顺便说一句,您的规则对我来说太麻烦了,我会重新考虑它们,例如,3个字符包含两个字母、数字或符号。

    要要求每种字符类型中有一个,您可以使用以下方法:

    (?=.*\d)(?=.[a-z])(?=.[a-z])(?=.[!@$%&+~?])^.{15,25}$

    不过,我不太确定如何将其翻译成每种字符类型需要两个字符

    基本上,
    ?=
    匹配
    *
    的后缀(即任何内容),但不捕获任何内容,因此您可以检查是否满足指定顺序的所有条件

    ^(?=.*\d.*\d)(?=.*[a-z].*[a-z])(?=.*[A-Z].*[A-Z])(?=.*[!@#$%&+~?].*[!@#$%&+~?]).{15,25}$
    
    这个正则表达式将执行您想要的操作。它将通过您的密码字符串传递多达5次,但考虑到您正在使用它做什么,我不认为这是一个问题


    编辑以修复破坏正则表达式的打字错误。

    这将在经典代码中更具可读性和可维护性:

    伪代码是:

    int count_alpha = 0, count_digit = 0, count_symbol = 0, ...
    
    for each ch in password:
      if is_alpha(ch):
         count_alpha += 1
      elif is_digit(ch):
         count_digit += 1
      ...
    
    if (count_alpha < 2) or (count_digit < 2) or ...
      rejection_message() 
      ...
    
    int count\u alpha=0,count\u digit=0,count\u symbol=0。。。
    对于每个登录密码:
    如果是α(ch):
    计数α+=1
    elif是数字(ch):
    计数数字+=1
    ...
    如果(计数α<2)或(计数数字<2)或。。。
    拒绝消息()
    ...
    

    可能是您正在实现需求,而不是影响需求,但我通常建议您评估entrophy并使用现有代码来实现它。

    我认为也可以如下所示:

    ^(?=(.-d){2,})(?=([a-z]){2,})(?=([a-z]){2,})(?=([a-z]){2,})(?=([a-z]$%&+~?]){2,})$

    我知道这已经是一年前的事了,但从少数几个回答中,我推断这是可行的


    最上面的答案是正确的,只是在模式前面需要一个*而已。

    为什么要设置25个字符的上限?你没有把它存储在任何地方,是吗?很抱歉聊天,但根据“熵”选择最小密码长度并不是更明智的选择。例如-小写或大写40个字符,小写和大写30个字符,大写+小写+数字25个字符,所有可打印集最少15个字符。我个人总是讨厌我不得不逃避这样的限制。我同意其他经过投票的答案,这不适合regexYes,我们正在数据库中存储密码。我同意大多数人的看法,这对正则表达式不是一个好的用途,我已经使用了随机密码生成器来提供将为用户创建的密码,通过电子邮件发送给用户,并存储在数据库中。感谢您在这个问题上的出色贡献和辛勤工作!密码的最小值是15个字符,但我只是抓取了一个任意数字(25)作为上限。没有多少人想要15个字符的密码,更不用说25个字符了。如果你希望得到超长字符串,你可以创建一个变体,首先检查字符数。由于您仍要匹配整个字符串,因此字符计数步骤也可以是前瞻的一部分,这样您就不必重写表达式的任何其他部分。符号字符列表可以扩展为[!@$%&+-/`^)(| \=:;,}{~?]这需要两个数字(或同一组中的其他符号)在后续操作中,例如!%34dfZXaaaaaaaa将起作用,!%3DFZXAAAAAA1将不起作用。
    ^((?=(.*\d){2,})(?=(.*[a-z]){2,})(?=(.*[A-Z]){2,})(?=(.*[!@#$%&+~?]){2,})).{15,25}$