密码策略的正则表达式 [关闭]
Posted
技术标签:
【中文标题】密码策略的正则表达式 [关闭]【英文标题】:Regex for password policy [closed] 【发布时间】:2012-04-12 21:31:06 【问题描述】:我需要执行以下密码策略:
至少 9 个字符,4 个字符中的每个字符至少一个 字符类(小写和大写字母;数字、符号)。
任何正则表达式专家都可以在这里提供帮助吗? (我使用的是 Java 正则表达式引擎)
在我们研究的同时,是否有任何在线工具可以为这类任务生成正则表达式?
谢谢!
【问题讨论】:
正则表达式的一个很好的参考是vogella.de/articles/JavaRegularExpressions/article.html。请发布您已经尝试过的reg ex ***.com/questions/3387785/…的可能重复 @FelixKling 没什么问题,但我还有很多其他的东西我想先学习 ;) 不要!这已经在 SO 上回答了很多次,参见例如***.com/a/3466868/297323 将其分解为不同的功能,每个功能执行一次检查。这种方法是面向未来的,最重要的是它是可维护的。 好吧,吸取教训了。感谢您的链接,它将开始调查。 【参考方案1】:我会这样做(使用积极的前瞻):
(?=.9,)(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\pPunct).*
完整示例和测试:
// 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
"(?=.*\\pPunct)"+ // --- ' ' --- 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 同意,但是很高兴让事情发生在客户端,所以它们很漂亮:) - 如果你愿意,你可以尝试在后端保存并运行验证(远程)。但是在它到达你的机器之前进行验证是很好的(如果可能的话)。以上是关于密码策略的正则表达式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章