创建正则表达式以检查强密码

时间:2009-07-20 10:53:43

标签: c# regex passwords

假设我有一个检查字母数字的正则表达式。

我现在想创建另一个正则表达式,用于检查密码中至少有一个数字。 我想检查它是否至少有一个非字母数字字符(除了字母或数字之外的其他字符)。

我应该只调用每一个seperatley,如果一个失败则返回false或者是否有办法将它们组合成1个呼叫?

7 个答案:

答案 0 :(得分:3)

取决于您正在使用的标准,但最好是通过字符串进行单次传递并根据您所看到的内容设置一些标记:

  • hasDigit
  • hasAlpha
  • hasSymbol

然后在最后使用这些来确定密码是否足够复杂。

更好:

正如lexu建议的那样,使用计数代替标记可以提供更大的灵活性。

答案 1 :(得分:3)

我会使用&&:

编写小方法
internal bool HasDigit(string password) { .. }
internal bool HasNonAlpha(string password) { .. }

bool IsStrong(string password) {  
   return HasDigit(password) && HasNonAlpha(password);
}   

答案 2 :(得分:2)

我认为这就是你要找的东西:

^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$

(将匹配最小长度为6的密码,至少包含一位数字和一位非字母数字字符)

在代码中:

public bool PasswordOk(string pwd) 
{
    return Regex.IsMatch(pwd,@"^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$");
}

答案 3 :(得分:1)

你应该使用两个电话。要进行更高级的测试,您可以使用password meter。它可以在GPL下免费分发。

答案 4 :(得分:1)

恕我直言,这是一个风格问题,是否要从中做出一两个陈述。

为什么不在它们可能出现的两个订单中的任何一个中检查它。 (正如常规表达式所示,我们没有类似于括号或括号的计数器,因此我们必须遵守可能的事物顺序。

那可能适用于perl:

(\d.*[^[:alnum:]])|([^[:alnum:]].*\d)

可能更容易阅读从中发表两个语句,特别是因为每个语义条件只发生一次。

答案 5 :(得分:0)

你添加一个| (或)运算符进入正则表达式,例如

[0-9] | [A-Z]

答案 6 :(得分:0)

正则表达式不是最快的方法。

尝试一下:

string Password = "Pass12!";

bool ValidPassword = Password.Any(char.IsDigit)
    && !Password.All(char.IsLetterOrDigit)
    && Password.Length >= 6;

而不是:

string Password = "Pass12!";

bool ValidPassword = Regex.IsMatch(Password, @"^.{6,}(?<=\d.*)(?<=[^a-zA-Z0-9].*)$");

我重复它一百万次,它将需要前157ms和第二次1251ms。

其他人已经说过最重要的事情:维护得好得多。