正则表达式包括拉丁字符

我有一个正则表达式,以确保密码具有大写和小写字符,并限制为几个符号:

^(?:(?=[^az]*[az])(?=[^AZ]*[AZ])(?=.*[$@$!%*?&,;.:-_])[A-Za-z\d$@$!%*?&,;.:-_]+)?$ 

注意:它允许空密码。 我正在检查另一种方式。

但是它不允许使用拉丁字符,如ç,á,õ等。

如何添加此类字符?

UPDATE

我正在尝试创建一个与Microsoft选项同步的密码validation正则表达式,例如:

 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 

Microsoft文档: https : //docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-configuration?tabs=aspnetcore2x

所以我希望每个都有一个正则表达块,所以我可以通过添加或删除规则并进行任何组合来更改它。

这有意义吗?

概观

限制密码通常是不好的做法,所以如果是这样,请不要使用以下正则表达式。 在任何情况下,我都知道有些人喜欢至少确保存在一些字符集(大写,小写,数字,符号等),并且在需要这样的事情时会有特殊情况。 下面的正则表达式确保至少有一个小写,大写,数字和符号(在任何语言/脚本中)存在于至少8个字符的字符串中。

正如问题下面的评论所示,将密码限制为特定字符集或特定格式只是​​在寻找麻烦。 正如@maccettura所建议的,攻击者可以过滤字典攻击并消除大量与您的密码格式不匹配的字典项。 编写,例如[A-Za-z\d$@$!%*?&,;.:-_] ,攻击者可以简单地删除包含列表中其他字符的任何密码。 该列表也只包含75个字符。 有多少75个字符的排列? 对于长度为8个字符的密码,即680,240,886,192,000个排列(如果我们删除与下面的正则表达式不匹配的密码,则更少)。 你的CPU需要多长时间才能破解密码?

请参阅以下有关密码的StackExchangepost:

  • 2010年及以后的密码破解
  • 登录表单中的密码validation

其他文章:

  • 密码规则是废话 (作者杰夫阿特伍德)

请参阅此处使用的正则表达式

 ^(?=\P{Ll}*\p{Ll})(?=\P{Lu}*\p{Lu})(?=\P{N}*\p{N})(?=.*[^\p{‌​L}\p{N}\p{C}]).{8,}$ 

说明

\p{x}表示由x指定的Unicode常规类别或命名块

  • ^在行的开头断言位置
  • (?=\P{Ll}*\p{Ll})确保任何脚本中至少存在一个小写字母
  • (?=\P{Lu}*\p{Lu})确保任何脚本中至少存在一个大写字母
  • (?=\P{N}*\p{N})确保任何脚本中至少存在一个数字字符
  • (?=.*[^\p{‌​L}\p{N}\p{C}])确保存在除字母,数字或控制字符以外的任何字符
  • .{8,}确保密码长度至少为8字符(并且不限于上限)
  • $在行尾的Assert位置