强密码正则表达式

Jen*_*Jen 1 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]))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

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

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

^(([AZ])?|([AZ])|?(\ d)|?([^ A-ZA-Z\d]))(*()\ 1 {2}?!). {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]))(?=(.) (?>.?(?!\ 1})(.))(?>.?(?!\ 1} |\2)(.))(?>.?(?!\ 1 |\2 |\3)(.))(?>.?(?!\ 1 |\2 |\3 |\4)(.))(?>.?(?!\ 1 |\2 |\3 |\4 |\5).))(?!.?\ d {4})(?!.?[az] {4})(?!.?[AZ] {4})(?!.*?[^ A -Za-Z0-9\s]的{4})

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

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

Qta*_*tax 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
Run Code Online (Sandbox Code Playgroud)

未经测试可能会错过一些东西.请享用.;-)

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