【问题标题】:Password validation - adding additional requirments密码验证 - 添加额外要求
【发布时间】:2012-04-15 06:49:16
【问题描述】:

我有一些当前检查最小和最大长度的代码。我还想要求大写、小写、特殊字符和数字。关于添加什么或在哪里可以找到一些示例的任何建议?我一直在谷歌搜索和浏览这个论坛,并一直在尝试添加额外的密码要求,但没有成功。

这是我想要的。

长度至少为八个字符 长度不超过 20 个字符 至少小写字母和一个大写字母 至少有一个特殊字符来自:!@#$%^&*()~`-=_+[]{}|:";',./? 至少一个数字 [0-9] 字符 无法匹配帐户登录名或电子邮件地址

我当前的密码验证码

public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password)
{
    if(TextUtils.isEmpty(password))
        return false;

    int len = password.length();

    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH)
        return false;

    for(int i = 0; i < len; i++)
    {
        char c = password.charAt(i);
        if (Character.isWhitespace(c))
            return false;
    }

    return true;
}

【问题讨论】:

  • 那么你为什么不直接实现你的需求呢?
  • ?正如我已经提到的,我尝试过但没有成功。我该如何实现?我是网页设计师,不是 Java 程序员,但我正在尝试编辑一些代码以满足新的需求。
  • 顺便说一句:这可能看起来违反直觉,但对密码添加更多限制实际上会降低安全性,因为人们倾向于输入 Capitalisedword1! 形式的密码。只需设置至少 8 个字符的长度即可。
  • @rick - “我是网页设计师,不是 Java 程序员” - 你要么需要提高 Java 编程技能,要么找一个可以分包任务的 Java 程序员像这样到。现在,这个问题听起来像是你希望别人为你做你的工作......免费。这不是 SO 的目的。

标签: java validation passwords


【解决方案1】:

当您分析String 数据时,您应该擦除左右两边的空格。这是由Strimg#trim 函数完成的,如下所示:

password = password.trim();

要分析字符串的每个字符,您可以将其转换为 char 数组,这样会更容易满足您的要求:

char[] arrPassword = password.toCharArray();

现在您可以使用以下函数评估字符:Character#isUpperCaseCharacter#isLowerCaseCharacter#isDigit

最后但并非最不重要的一点是,您可以拥有一个带有您需要检查的特殊字符的字符串,并检查您正在评估的实际字符是否在该字符串内。这可以使用String#indexOfString#valueOf 来实现,这是将char 转换为String 类型的最后一个方法。

这是所有这些解释的代码示例:

public static final String SPECIAL_CHARACTERS = "!@#$%^&*()~`-=_+[]{}|:\";',./<>?";
public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password) {
    if (TextUtils.isEmpty(password)) {
        System.out.println("empty string.");
        return false;
    }
    password = password.trim();
    int len = password.length();
    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH) {
        System.out.println("wrong size, it must have at least 8 characters and less than 20.");
        return false;
    }
    char[] aC = password.toCharArray();
    for(char c : aC) {
        if (Character.isUpperCase(c)) {
            System.out.println(c + " is uppercase.");
        } else
        if (Character.isLowerCase(c)) {
            System.out.println(c + " is lowercase.");
        } else
        if (Character.isDigit(c)) {
            System.out.println(c + " is digit.");
        } else
        if (SPECIAL_CHARACTERS.indexOf(String.valueOf(c)) >= 0) {
            System.out.println(c + " is valid symbol.");
        } else {
            System.out.println(c + " is an invalid character in the password.");
            return false;
        }
    }
    return true;
}

System.out.println(c + " is an invalid character in the password.");这句话只是为了检查分析实际字符的结果。

【讨论】:

  • 什么是空的??
  • @ArpitPatel 已修复
【解决方案2】:

斯蒂芬说得对,只要稍微搜索一下,您就可以在这里轻松找到答案。但是斯蒂芬所指的线程正在使用第三方库。

如果你想自己实现这个,那么在开始 for 循环之前用 false 为你的要求初始化 4 个布尔值。循环检查所有四个要求,直到一个为真。将相应的布尔值设置为 true。

如何检查4个要求:

  • 您已经实现的长度要求。
  • Character(yourChar).isLowerCase()
  • 字符(yourChar).isUpperCase()
  • 特殊字符:参见此处:Java String Special character replacement - 您可以选择类似的方法

循环后检查 4 个布尔值并做出相应反应。

【讨论】:

    【解决方案3】:

    一些好的旧正则表达式怎么样?这似乎工作正常,虽然可能在特殊字符检查的转义中滑倒了

    Pattern[] checks = {
            Pattern.compile("[!@#\\$%^&*()~`\\-=_+\\[\\]{}|:\\\";',\\./<>?]"),
            Pattern.compile("\\d+"), 
            Pattern.compile("[A-Z]+"),
            Pattern.compile("[a-z]+"), 
            Pattern.compile("^.{8,20}$") };
    
    for (String test : new String[] { "password", "Password1",
            "Password1&", "toolongtoolongtoolong" }) {
        boolean ok = true;
        for (Pattern check : checks) {
            ok = ok && check.matcher(test).find();
        }
        System.out.println(test + " " + ok);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 2016-05-24
      • 2014-08-12
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2018-05-30
      • 2013-03-21
      相关资源
      最近更新 更多