密码验证 - 添加其他要求

时间:2012-04-01 06:30:21

标签: java validation passwords

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

这就是我想要的。

长度至少为八个字符  长度不超过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;
}

3 个答案:

答案 0 :(得分:4)

当您分析String数据时,您应该删除右侧和左侧的空白。这是由Strimg#trim函数完成的,如下所示:

password = password.trim();

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

char[] arrPassword = password.toCharArray();

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

最后但并非最不重要的是,您可以使用需要检查的特殊字符的String,并检查您正在评估的实际字符是否在该String内。这可以使用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.");句只是检查分析实际角色的结果。

答案 1 :(得分:2)

一些好的旧正则表达式怎么样?这似乎工作正常,虽然可能在逃避特殊字符检查时失误

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);
}

答案 2 :(得分:0)

斯蒂芬说得对,你可以在这里轻松找到你的答案。但Stephen提到的主题是使用第三方库。

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

如何检查4项要求:

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

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