【问题标题】:Regex for password policy [closed]密码策略的正则表达式 [关闭]
【发布时间】:2012-04-12 21:31:06
【问题描述】:

我需要执行以下密码策略:

至少 9 个字符,4 个字符中的每个字符至少一个 字符类(小写和大写字母;数字、符号)。

任何正则表达式专家都可以在这里提供帮助吗? (我使用的是 Java 正则表达式引擎)

在我们研究的同时,是否有任何在线工具可以为这类任务生成正则表达式?

谢谢!

【问题讨论】:

标签: regex passwords


【解决方案1】:

我会这样做(使用积极的前瞻):

(?=.{9,})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\p{Punct}).*

完整示例和测试:

                       //    Regexp                Description
Pattern p = Pattern.compile("(?=.{9,})"   +     // "" followed by 9+ symbols
                            "(?=.*[a-z])" +     // --- ' ' --- at least 1 lower
                            "(?=.*[A-Z])" +     // --- ' ' --- at least 1 upper
                            "(?=.*[0-9])" +     // --- ' ' --- at least 1 digit
                            "(?=.*\\p{Punct})"+ // --- ' ' --- at least 1 symbol
                            ".*");              // the actual characters
String[] tests = {
        "aB99",         // too short
        "abcdefghijk",  // missing A
        "abcdefGHIJK",  // missing 5
        "12345678910",  // missing a
        "abcDEF12345",  // missing punct
        "abcDEF-2345"   // works!
};

for (String s : tests) {
    boolean matches = p.matcher(s).matches();
    System.out.printf("%-12s: %b%n", s, matches);
}

输出:

aB99        : false
abcdefghijk : false
abcdefGHIJK : false
12345678910 : false
abcDEF12345 : false
abcDEF-2345 : true

最后的评论:这种方法的问题在于它对用户不是很友好。如果您要对用户做出明智的回应,例如“密码缺少数字符号”,您需要再次执行此工作(以确定哪个要求失败)。

【讨论】:

    【解决方案2】:

    我会使用多个正则表达式来解决这个问题:

    9 个字符 - 您可以对此进行正则表达式,但 .length() >= 9 更好!

    对于字符类,您应该使用一个 pr 类:

    [a-z]+
    [A-Z]+
    [0-9]+
    [£$%&{[...]+ //all the possible symbols you want to accept
    or perhaps: 
    [:punct:]+ // this depends on your programming language..
    or like in the suggestion by @david-halter:
    [^\w\s]+  // not alphanumeric or spaces
    

    【讨论】:

      【解决方案3】:
      (?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].*
      

      请注意,此模式不包括特殊的 utf 字符,例如 ö。我不会在一个正则表达式中这样做。如果你想验证它,我会拆分它并搜索每一件事。

      【讨论】:

      • 如果您在 javascript 领域并使用 jquery,我建议您使用 jquery 验证插件,这是一个强大的密码要点gist.github.com/mrgcohen/9806928
      • @mc 如果您仅在应用程序的 js 端验证数据,则根本没有安全性。无论如何都必须执行服务器验证。
      • @Dariusz 同意,但是很高兴让事情发生在客户端,所以它们很漂亮:) - 如果你愿意,你可以尝试在后端保存并运行验证(远程)。但是在它到达你的机器之前进行验证是很好的(如果可能的话)。
      猜你喜欢
      • 1970-01-01
      • 2016-10-20
      • 2015-12-27
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2013-01-20
      相关资源
      最近更新 更多