用于密码验证的RegEx(ASP)

时间:2011-10-19 20:08:25

标签: regex vbscript asp-classic

有人可以建议使用正则表达式来验证具有以下条件的密码。

  • 密码长度必须至少为12个字符
  • 密码不得以数字开头
    • 密码必须具有以下4个特征中的3个:
    • 至少一个大写字母(A-Z)
    • 至少一个小写字母(a-z)
    • 至少一个数字(0-9)
    • 至少下列符号之一: 连字符( - ),下划线(_),美元($),磅/哈希(#)

我正在使用vbscript和经典ASP。

提前致谢, m0dest0

3 个答案:

答案 0 :(得分:7)

虽然有点笨拙,但这可以在单个正则表达式中实现,如下所示:

Dim myRegExp
Set myRegExp = New RegExp
myRegExp.Pattern = "^(?=.{12})(?![0-9])(?:(?=[^a-z]*[a-z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^0-9]*[0-9])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^\-_$#]*[\-_$#])|(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=[^0-9]*[0-9]))[A-Za-z0-9-_$#]+$"
If myRegExp.Test(SubjectString) Then
    ' Successful match
Else
    ' Match attempt failed
End If

以下是正则表达式的注释版本:(在PHP自由间隔模式语法中 - 可以由凡人阅读):

$re_password = '/
    # Match password having multiple, specific requirements.
    ^                       # Anchor to start of string.
    (?=.{12})               # Password must be at least 12 characters long.
    (?![0-9])               # Password must not begin with a number.
    (?:                     # Password must have 3 out of 4 characteristics:
       # Either... Case 1: (All but R1).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 2: (All but R2).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 3: (All but R3).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^-_$\#]*[-_$\#])  # R4: At least one of: [-_$#].
    |  # Or... Case 4: (All but R4).
      (?=[^A-Z]*[A-Z])      # R1: At least one upper case letter (A-Z).
      (?=[^a-z]*[a-z])      # R2: At least one lower case letter (a-z).
      (?=[^0-9]*[0-9])      # R3: At least one number (0-9).
    )                       # End group of 3-out-of-4 alternatives.
    [A-Za-z0-9-_$\#]+       # Match the password string.
    $                       # Anchor to end of string.
    /x';

这假设密码不能包含以下字符:[A-Z][a-z][0-9][-_$#]。还假设密码可能包含来自所有4种类型的字符。

“4个要求中的3个”在这里通过强力解决(通过明确指定所有可能的案例组合作为一组备选方案 - 并重复每个案例的公共表达式)。这可以在这里工作,因为只有4种可能的情况需要测试,但如果有更多要求(例如“必须满足20个要求中的5个......”),这种方法会变得非常笨拙。正如其他人所说,将其分解为多个部分有一定的好处,例如:每种故障模式都可以显示自定义错误消息。

但是这个可以用一个正则表达式完成!

编辑2011-10-20:通过用更精确的贪婪表达替换懒点星来提高4个要求前瞻表达式的效率。

答案 1 :(得分:3)

尝试使用单个表达式执行此操作确实没有多大意义,听起来很棒......

我会用多个表达式来做,因为它们运行得更快,看起来更干净,更易于维护,结果可以用来提供关于密码为何不匹配的反馈(如果你想成为那很好)

这些表达式将按照指示进行验证:

.{12,}            # Password must be at least 12 characters long
^(?!\d)           # Password must not begin with a number
(.*[A-Z].*)+      # At least one upper case letter (A-Z)
(.*[a-z].*)+      # At least one lower case letter (a-z)
(.*[0-9].*)+      # At least one number (0-9)
(.*[-_$#].*)+     # At least one of the following symbols: hyphen ( - ), underscore ( _ ), dollar ( $ ), pound/hash ( # )

将每一个评估为布尔值,然后在不满足它们的情况下提供反馈

话虽这么说,这是一个非常严格的密码策略 - 只是不以数字开头会让人更容易猜到。

我认为它可以被放入一个正则表达式,但idunno - 我可能会解决它

答案 2 :(得分:2)

当你拥有的只是一把锤子呃?

说真的,使用正则表达式并不是真正正确的答案。如果您已经开始使用正则表达式,那么至少将其分解为多个案例并单独评估每个案例。

如果是我,我只会编写一组简单的函数来检查每个案例。例如:一个用于大写/小写,一个用于数字,一个用于特殊符号,然后是一个主程序,用于检查是否满足所有要求。正如上面提到的FailedDev,处理所有这些情况的单个正则表达式对写入和维护都是一种痛苦。