这个问题是这里问题的后续问题:
Why is char[] preferred over String for passwords?
这个问题对于理解为什么使用 char[] 而不是 String 很好;但是,它没有解释如何以安全的方式对 char[] 执行密码验证。这就是我想知道的。
简单来说,我需要检查密码是否满足以下要求:
- 至少包含一个大写字母
- 至少包含一个小写字母
- 至少包含一个数字
- 至少包含一个符号
- 至少是 n 个字符,但不超过 m
现在我明白了如何使用正则表达式来执行验证......这些答案展示了如何做到这一点:
- Regexp Java for password validation
- Password must be 8 characters including 1 uppercase letter, 1 special character, alphanumeric characters
据我所知,正则表达式检查涉及处理字符串。使用它们似乎并不安全,因为字符串是不可变的,因此在使用它们后不能立即清除它们。另一方面,可以清除 char[]。
那么,如何对存储在 char[] 而不是字符串中的密码执行验证?
我可以遍历每个字符,但随后我必须创建每个要测试的集合。理想情况下,能够利用正则表达式会很有用。
在Java中,我可以通过以下方法进行正则表达式检查。
String.matches(String regex)
或者
Pattern pattern = Pattern.compile(String regex);
pattern.matcher(CharSequence testString).matches();
如您所见,这两种方法都不支持直接使用 char[]。
最佳答案
我会尽量避免使用复杂的正则表达式,我会建议类似 -
boolean validatePassword(char[] password, int n, int m) {
if (password == null || password.length < n || password.length > m) {
return false;
}
boolean upper = false;
boolean lower = false;
boolean digit = false;
boolean symbol = false;
for (char ch : password) {
if (Character.isUpperCase(ch)) {
upper = true;
} else if (Character.isLowerCase(ch)) {
lower = true;
} else if (Character.isDigit(ch)) {
digit = true;
} else { // or some symbol test.
symbol = true;
}
// This short-circuits the rest of the loop when all criteria are true.
if (upper && lower && digit && symbol) {
return true;
}
}
return upper && lower && digit && symbol;
}
关于java - 如何对安全密码执行验证。 char[] 上的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924321/