我有一个正则表达式,以确保密码有大写和小写字符,并限制为几个符号:
^(?:(?=[^a-z]*[a-z])(?=[^A-Z]*[A-Z])(?=.*[$@$!%*?&,;.:-_])[A-Za-z\d$@$!%*?&,;.:-_]+)?$
注意:它允许空密码。我正在检查另一种方式。
然而,它不允许使用拉丁字符,如ç,á,õ等。
如何添加此类字符?
更新
我正在尝试创建一个与Microsoft选项同步的密码验证Regex,例如:
RequireDigit (Default = true)
Requires a number between 0-9 in the password.
RequireNonAlphanumeric (Default = true)
Requires a non-alphanumeric character in the password.
RequireUppercase (Default = true)
Requires an upper case character in the password.
RequireLowercase (Default = true)
Requires a lower case character in the password.
RequiredUniqueChars (Default = 1)
Requires the number of distinct characters in the password
所以我希望每个人都有一个正则表达块,所以我可以通过添加或删除规则来进行更改,并进行任何组合。
这有意义吗?
答案 0 :(得分:3)
限制密码通常是不好的做法,所以如果是这样,请不要使用以下正则表达式。在任何情况下,我都知道有些人喜欢至少确保存在一些字符集(大写,小写,数字,符号等),并且在需要这样的事情时会有特殊情况。下面的正则表达式确保至少有一个小写,大写,数字和符号(在任何语言/脚本中)至少包含8个字符的字符串。
正如下面的问题所提出的建议,将密码限制为特定的字符集或特定格式只会引发麻烦。正如@maccettura所建议的,攻击者可以过滤字典攻击并消除大量与您的密码格式不匹配的字典项。编写,例如[A-Za-z\d$@$!%*?&,;.:-_]
,攻击者可以简单地删除包含列表中的字符以外的任何密码。该列表也只包含75个字符。有多少75个字符的排列?对于长度为8个字符且680,240,886,192,000
排列的密码(如果我们删除与下面的正则表达式不匹配的密码,则更少)。你的CPU需要多长时间才能破解密码?
请参阅以下有关密码的StackExchange帖子:
其他文章:
^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=\P{N}*\p{N})(?=.*[^\p{L}\p{N}\p{C}]).{8,}$
\p{x}
表示由x
^
在行首处断言位置(?=\P{Ll}*\p{Ll})
确保任何脚本中至少存在一个小写字母(?=\P{Lu}*\p{Lu})
确保任何脚本中至少存在一个大写字母(?=\P{N}*\p{N})
确保任何脚本中至少存在一个数字字符(?=.*[^\p{L}\p{N}\p{C}])
确保存在除字母,数字或控制字符以外的任何字符.{8,}
确保密码长度至少为8
个字符(并且不限于上限)$
断言行尾的位置