用于密码强度验证的正则表达式问题

5

我正在寻找一个适用于我们密码要求的单个正则表达式。密码应满足以下要求:

  • 至少8个字符
  • 不能包含空格
  • 包含大小写字母
  • 包含至少一个数字
  • 包含至少一个特殊字符(即任何不是0-9,a-z,A-Z的字符)
正则表达式示例:^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^0-9a-zA-Z]).{8,}$

4
这是对正则表达式的可怕误用。手动处理很简单。我建议不要使用正则表达式进行此操作。 - Mark Peters
我看到了组合爆炸... - Marc Mutz - mmutz
1
它必须以单个表达式的形式出现,这使得对于需要维护它的人来说变得复杂且难以阅读。我建议将其拆分为不同的测试,以使其更易于维护。您还忘记了提及您使用的正则表达式引擎,因为您可以做的事情有所不同。根据测试的位置,向用户提供密码失败原因的反馈可能是有趣的。 - some
1
相关的 - http://thedailywtf.com/Articles/Security-by-PostIt.aspx - John Himmelman
2个回答

8

编写逻辑可能会更容易。正则表达式用于匹配模式。密码往往是一些随机字符串,因此这个问题不容易通过正则表达式来解决。虽然有可能通过正则表达式解决,但是代码将变得难以理解且难以维护。


4

差不多+1。所引用的文章很好,但错误地建议在表达式开头使用.*点星号(这是不必要的,因为末尾的点星号将匹配字符串)。虽然对于这个特定的问题没有害处(你的答案是正确的并且可以正常工作),但如果密码长度有上限,则会失败。如果长度要求是8到12个字符,则正确的表达式应该是:^(?=.{8,12}$)(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*\W)\S*$(还要注意,在lookahead中不需要\S)。否则回答很好。 - ridgerunner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接