java – 如何对安全密码执行验证. char []上的正则表达式?

前端之家收集整理的这篇文章主要介绍了java – 如何对安全密码执行验证. char []上的正则表达式?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题是对这个问题的跟进:

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相关文章