这个问题是对这个问题的跟进:
Why is char[] preferred over String for passwords?
这个问题非常适合理解为什么使用char []而不是String;但是,它没有解释如何以安全的方式对char []执行密码验证。这就是我想知道的。
简单地说,我需要检查密码是否符合以下要求:
现在我明白了如何使用正则表达式来执行验证......这些答案显示了如何做到这一点:
据我所知,正则表达式检查涉及使用字符串。使用它们似乎不安全,因为字符串是不可变的,因此在使用它们后不能立即清除它们。另一方面,char []可以被清除。
我可以遍历每个角色,但是我必须创建我想要测试的每个角色。理想情况下,能够利用正则表达式会很有用。
在Java中,我可以通过以下方法进行正则表达式检查。
String.matches(String regex)
或者
Pattern pattern = Pattern.compile(String regex);
pattern.matcher(CharSequence testString).matches();
如您所见,这两种方法都不支持直接使用char []。
答案 0 :(得分:5)
我会尽量避免复杂的正则表达式,我建议像 -
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;
}
答案 1 :(得分:4)
只需遍历char[]
即可进行基本密码验收验证
答案 2 :(得分:1)
Java的正则表达式实现不需要String
个对象 - 您需要传递CharSequence
。如果您不想从String
数组创建char[]
,则可以在自己的CharSequence
接口实现中包装数组。
答案 3 :(得分:1)
您可以使用CharBuffer.wrap(char[])
以CharSequence
的形式访问char数组。
Pattern.matches(regex, CharBuffer.wrap(myCharArray))