【问题标题】:How to do password validation with regex? [closed]如何使用正则表达式进行密码验证? [关闭]
【发布时间】:2013-09-15 17:40:40
【问题描述】:

条件: 密码必须至少包含 8 个字符,其中至少包含以下两种字符:大小写字母、数字和特殊字符。

哪种模式可以符合条件?

【问题讨论】:

  • 实际的special characters 是什么?
  • 您不要为此使用正则表达式。
  • 我个人认为这个密码策略很烂。 “特殊”字符很容易被机器猜到,而人们很难记住。 xkcd/936
  • 我同意娜奥米的观点。大多数人只会把它写下来然后放在办公桌附近,这实际上会导致安全性降低。

标签: c# regex passwords


【解决方案1】:

正则表达式是完全错误的方法。而是简单地计算每种字符类型的出现次数,然后简单地使用 if 语句和布尔逻辑来检查是否满足您的要求。

但是,请重新考虑您想做的事情是否是个好主意:

  • 限制符号是一个非常糟糕的主意。应该允许任何字符
  • 当密码有一定长度时,需要例如符号/数字/混合大小写失去了很多用途。此外,攻击者无法知道某些用户在其密码中是否仅使用小写字符或仅数字,因此他无法将暴力攻击调整为仅使用这些字符 - 并且由于您希望限制不正确的登录,因此暴力不是无论如何都是不错的选择。
  • 想象一下著名的xkcd 中的“正确的马电池订书钉”。虽然所有这些单词都在字典中,甚至可能无法通过不正确实施的密码检查,但它非常安全。虽然单个字典单词非常不安全,但其中的多个单词很容易记住和保护(攻击者必须尝试所有例如 4 个单词的组合,即使只有 1000 个单词的字典也是如此)。

所以一个更好的密码策略会:

  • 拒绝明显不好的序列。那是 12345 或 54321 之类的连续数字。qwertz、qwerty 等也很糟糕。
  • 拒绝任何可以在整个字典中找到的密码。确保同时使用英语词典和您网站支持的每种语言的词典。
  • 拒绝任何其他可能不安全的密码。包含用户名(即使向后)?没有。包含用户电子邮件地址@之前的部分?没有。包含他的生日?没有。
  • 至少需要 8 个字符(正如您已经打算做的那样)。

在 IT 安全堆栈交换网站上还有一篇有趣的帖子,您应该阅读:Short complex password, or long dictionary passphrase?

【讨论】:

  • 是的,我也在考虑使用布尔日志记录,但这是否可以解决密码是否有任何符号 if (!password.Any(c => char.IsSymbol(c )))
【解决方案2】:
string PASSWORD_PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20})";
string password = "Password@1#";
Regex.IsMatch(password,PASSWORD_PATTERN);

试试这个。

【讨论】:

  • 您的解决方案缺少说明或证明它按预期工作。
猜你喜欢
  • 2011-05-22
  • 1970-01-01
  • 2018-06-14
  • 2020-11-16
  • 2013-07-10
  • 2021-10-17
相关资源
最近更新 更多