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

标签 java regex validation passwords arrays

这个问题是这里问题的后续问题:

Why is char[] preferred over String for passwords?

这个问题对于理解为什么使用 char[] 而不是 String 很好;但是,它没有解释如何以安全的方式对 char[] 执行密码验证。这就是我想知道的。

简单来说,我需要检查密码是否满足以下要求:

  • 至少包含一个大写字母
  • 至少包含一个小写字母
  • 至少包含一个数字
  • 至少包含一个符号
  • 至少是 n 个字符,但不超过 m

现在我明白了如何使用正则表达式来执行验证......这些答案展示了如何做到这一点:

据我所知,正则表达式检查涉及处理字符串。使用它们似乎并不安全,因为字符串是不可变的,因此在使用它们后不能立即清除它们。另一方面,可以清除 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/

相关文章:

java - 自 Java 1.7 以来的助记符行为(在 1.8.0.121 中仍然存在)

python - 正则表达式 : Remove all commas between a quote separated string [python]

validation - 如何使用验证数据调整超参数

javascript - 如何制作验证电话号码中的国家/地区代码的正则表达式

java - Hibernate Validator 中的验证

html - 在此上下文中,元素输入不允许作为元素 ul 的子元素

java - Material 设计向后兼容android :colorAccent requires API level 21 when using appcompat7

java - 让 Eclipse 捕获仅从我自己的代码抛出的异常?

java - GWT 阿拉伯语渲染

正则表达式 - 忽略匹配中字符串的某些部分