.NET Regular Expression创建STRONG密码

时间:2009-09-28 20:29:25

标签: .net regex

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

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

密码要求:

  1. 最少15个字符(最多25个)
  2. 两个数字
  3. 两个大写字母
  4. 两个小写字母
  5. 两个特殊字符! @ # $ % & + ~ ?
  6. 他们不需要彼此相邻。按照我粘贴的正则表达式所需的特定顺序。

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

    它需要RE中的特定顺序......这不是我想要的!

    这应该传递一个格式正确的RE,其中包含上面列出的规格:Qq1W!w2Ee#3Rr4 @ Tt5

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

7 个答案:

答案 0 :(得分:10)

我认为你正在寻找的不仅仅是正则表达式的目的。

考虑这样的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;
}

答案 1 :(得分:3)

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

伪代码将是:

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() 
  ...

可能是您正在实施要求而不是影响它们,但我通常建议使用现有代码来估算这些要求。

答案 2 :(得分:2)

据我所知,你不能合理地做到这一点,这意味着你必须在正则表达式中列出所有可能的订单组合,这将最多组合24个。

我会做4次单独的检查:

  • \d{2,}
  • [a-z]{2,}
  • [A-Z]{2,}
  • [!@#$%&+~?]{2,}

相关问题:Variable order regex syntax

顺便说一句,你的规则对我来说太麻烦我会重新考虑它们,例如,有三个字符,两个字符,数字或符号。

答案 3 :(得分:1)

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

这个正则表达式会做你想要的。它将通过您的密码字符串进行最多5次传递,但考虑到您正在使用它,我不认为这是一个问题。

修改了破坏正则表达式的拼写错误。

答案 4 :(得分:0)

要求每种字符类型中的一种,您可以使用:

  

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

我不太确定如何将其转换为需要两种字符类型。

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

答案 5 :(得分:0)

我认为也可以如下:

^(?=( \ d){2,})(?=(。 [AZ]){2,})(?=( [AZ]) (?=( [@#$%&安培!?; +〜]){2})。{2,})){15,25} $

答案 6 :(得分:0)

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

我知道这已经有一年了,但是从少数回复中我得知这会起作用。

最佳答案是正确的,除了它只需要在模式之前的*。