强密码正则表达式

时间:2011-07-08 00:49:57

标签: regex

好的,所以我对正则表达式有一个心理障碍 - 但我被告知想出一个满足这些条件的正则表达式:

  • 必须至少8个字符(简单!)
  • 必须包含4种不同字符类型中至少3种字符 - 大写字母,小写字母,数字,符号(ok)
  • 必须至少有5个不同的字符
  • 一定不能有相同字符类型的长序列(例如,asdnme​​会被认为是错误的,因为它是一个较长的小写序列)
(?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z])|(?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s]))

这个正则表达式满足1和2.但我很难找到3和4的例子。

如果任何正则表达式爱好者可以帮助我 - 我们将不胜感激。 :)

注意:我不想使用正则表达式 - 这是我问任何人是否可以使用正则表达式检查第3和第4个条件?请不要因为相信正则表达式是唯一的解决方案而向我投票。我不相信 - 我们的achitect决定使用正则表达式来解决这个问题的努力最少。

我个人认为这种级别的密码安全性会使系统无法使用!但也许我对密码安全不够关心:)

注意:我们正在尝试使用Microsoft ASPNET Membership - regex表达式。这就是为什么我认为它需要是一个表达式。我觉得尝试阅读/理解是可怕的。

如果有人可以提供单独的正则表达式 - 必须至少有5个不同的字符 - 不能有相同字符类型的长序列(例如,asdnme​​会被认为是坏的,因为它是一个长序列的小写) - 假设5序列太长了..

或c#code / javascript?虽然这是特定于一个特定客户端 - 我们不希望它被空白应用于所有客户端。这可能就是为什么架构师需要一个很好的正则表达式,你可以在部署时插入。 :(

找到了其他适用于.NET的示例

^(([AZ])(*()\ 1 {2}?!。)|?([AZ])|(\ d)|?([^ A-ZA-Z \ d ])){8}((上)((下?)((数字)|((非字母数字)|?())?!)|((数字)((非字母数字)|?(?! ))|()))|?!((下)((数字)((非字母数字)?|?())|?!())|?!?!()))$

不幸的是它符合这些条件:

  • 最小长度必须为8个字符

  • 必须包含以下四种类型中的三种的字符:

  • 英文大写字母(A - Z)

  • 英文小写字母(a - z)

  • 数字(0 - 9)

  • 非字母数字字符

  • 连续3次或更多次不能重复任何字符,例如 BB(字母B两次)没问题,但BBB(字母B 3次)不行。

但它没有检测到至少使用了5个不同的字符:(

没关系 - 下面的答案似乎有效。唯一的问题是它似乎允许4个不同的字符,而不是需要5?

我把它调整为: ^(?= {8}。。。)(?:????(= \ d)(= [AZ])(= [AZ])|(= \ d)(= [^ A-ZA-Z0-9 \ S])(= [AZ])|???(= [^ A-ZA-Z0-9 \ S])(= [AZ])(= [AZ])|???(= \ d)(=?。 [AZ])(= [^ A-ZA-Z0-9 \ S]))(=()(大于?????<!EM>(\ 1} )())(大于(\ 1} | \ 2)())(大于???!???!(\ 1 | \ 2 | \ 3) )(大于(\ 1 | \ 2 | \ 3 | \ 4???!))(大于()();???<!EM>(\ 1 | \ 2 | \ 3 | \ 4 |。?!?\ 5)))( \ d {4})( [AZ] {4})(?[AZ] {4})(?!*?[^ A-ZA-Z0-9 \ s]的{4})

这里希望我们永远不必再次触摸它;)如果再次出现更多的时间,我会推动我认为的代码选项:)

编辑:发现字符串不太正确。它没有通过“!tt23yyy”而不必添加另一个数字或特殊字符。所以我们已经掌握了正则表达式的想法并且正在使用代码选项。如果你不理解正则表达式,那么调试正则表达式问题就太难了(可以这么理解)

1 个答案:

答案 0 :(得分:6)

这是一个PCRE / Perl正则表达式,可以完成所有这些:

/
^ # anchor it

# must be at least 8 characters
(?=.{8,})

# must have characters from at least 3 of the 4 different character types
(?: 
  (?=.*\d)(?=.*[A-Z])(?=.*[a-z])
| (?=.*\d)(?=.*[^A-Za-z0-9\s])(?=.*[a-z])
| (?=.*[^A-Za-z0-9\s])(?=.*[A-Z])(?=.*[a-z])
| (?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9\s])
)

# at least 5 different chars
(?=
                       (.)
  (?>.*?(?!\1})        (.))
  (?>.*?(?!\1}|\2)     (.)) 
  (?>.*?(?!\1|\2|\3)   (.)) 
  (?>.*?(?!\1|\2|\3|\4) . )
)

# no long sequence of the same character type (if long is 3)
(?!.*?\d{3})
(?!.*?[a-z]{3})
(?!.*?[A-Z]{3})
(?!.*?[^A-Za-z0-9\s]{3})

/xs

没有经过测试,所以可能错过了什么。请享用。 ; - )

如果您真的要使用它(在较长的字符串上),您可能需要添加一些(更多)原子分组(?>foo)(或类似物)以防止指数回溯。