【问题标题】:Can I write regex expression to check a password for some conditions?我可以编写正则表达式来检查某些条件的密码吗?
【发布时间】:2012-09-14 06:23:01
【问题描述】:

我正在处理一个要求,我必须创建一个强密码。必须满足以下条件:
-> 应该是大写字母、小写字母、数字和特殊字符的组合

我可以为此编写一个正则表达式吗?如果是怎么办?

【问题讨论】:

  • 请不要发明一系列对密码的任意限制。限制越多,the less secure the password is
  • 对不起,如果我的评论不太礼貌......无论如何,它有点希望你在提问之前先进行基本的网络搜索。 IE。 bing.com/search?q=c%23+regular+expressions+password 会给你一些不错的起始链接。将您尝试过但不符合您要求的示例与测试用例一起提供会使问题变得更好。
  • 问题陈述在创建与验证时发生冲突。
  • 为什么我的问题得到了 -1?我不应该为此获得-1!这太疯狂了!
  • 我同意 GuruC。编写规范的人应该收到很多反对票,这一点已经提出,但编码员可能别无选择,这个问题是有效且正确的。

标签: c# .net regex validation passwords


【解决方案1】:

例如,验证至少 8 个字符的密码:

if (Regex.IsMatch(subjectString, 
    @"^               # Start of string
    (?=.*\p{Lu})      # Assert at least one uppercase letter
    (?=.*\p{Ll})      # Assert at least one lowercase letter
    (?=.*\d)          # Assert at least one digit
    (?=.*[^\p{L}\d])  # Assert at least one other character
    .{8,}             # Match at least 8 characters
    $                 # End of string",             
    RegexOptions.IgnorePatternWhitespace))

【讨论】:

  • 我喜欢您通过查找任何非字母或数字来处理特殊字符的方式。但在实际使用中,这也会引入大量 ASCII 字符,这些字符可能会破坏程序或数据库,这取决于很多事情。对于密码,我通常使用允许我希望它允许的字符类,通常是键盘特殊字符,而不仅仅是任何东西。例如:[-~!@#$%^&*()_+={}|[]\:;,./?]`,我通常不允许UN 或 PW 中的引用,只是旧的注射安全习惯,可能并非所有技术都需要。
  • 糟糕,我在角色类中打了一个勾,把它弄坏了,哈哈。 [-~!@#$%^&*()_+={}|\[\]\:;<>,./?],几乎完美地说明了我的观点,即允许“任何事情”有时会产生不希望的结果,lawl
【解决方案2】:

不是真的。正则表达式旨在搜索/解析字符串,而不是生成字符串。是否有可能以某种方式使用它们,但代码的根不能(或至少不应该)依赖于正则表达式。

正则表达式可用于验证特定密码是否满足某些要求(即询问已生成的密码是否强密码)。因此,一种可能的策略是生成随机密码并继续尝试,直到验证为强密码。那将是一个非常个坏主意。您最好编写生成算法,使其始终首先生成强密码。

如果您的问题是是否可以使用正则表达式来验证用户生成的密码,那么请相应地更改问题,因为如果是这样,那么答案就是“是”。

【讨论】:

  • 标题似乎表明他在询问验证,而不是密码的生成。
  • @TimPietzcker 但是它说创建。含糊不清,但我们正在努力。
【解决方案3】:

如果您使用 FormsAuthentication,请在配置您的提供程序时尝试使用 passwordStrengthRegularExpression 属性。

http://msdn.microsoft.com/en-us/library/ms998347.aspx#paght000022%5Fsqlmembershipproviderconfig

【讨论】:

    【解决方案4】:

    是的。使用System.Text.RegularExpressions.Regex.IsMatch(string input,string pattern) 方法。

    if( Regex.IsMatch(pw,"[a-z]") &&
        Regex.IsMatch(pw,"[A-Z]") &&
        Regex.IsMatch(pw,"[0-9]") && 
        Regex.IsMatch(pw,"[!@#\$%\^&\*\(\)]"))
    

    【讨论】:

      【解决方案5】:

      你可以为此编写一个正则表达式,几乎可以写任何东西。

      我相信这会成功:

      ^.*(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$
      

      我在我的项目中使用了这个,但添加了一个我强烈建议的长度要求,如下所示:

      ^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&+=]).*$
      

      http://www.regular-expressions.info/reference.html

      【讨论】:

      • 这个正则表达式效率很低。至少在开始时删除.*,否则您将在验证失败的字符串上遇到灾难性的回溯。
      猜你喜欢
      • 2010-11-12
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2013-10-31
      • 2015-04-29
      • 2019-08-10
      相关资源
      最近更新 更多