防止弱口令,密码验证

首先说下需求:

     1、长度不少于8个字符 
      2、口令应该为以下4类字符的组合:大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符。
     每类字符至少包含一个,如果某类字符只包含一个,那么该字符不应该为首字符或尾字符。
     3、不为重复某些字符的组合(如A1a#A1a#)。
     4、不包含本人姓名、出生日期、登录名、email等与本人相关的信息
     5、不为历史口令

然后就是实现啦,直接贴代码

    public SimpleResultVo checkUserPwd(String password) {
        SimpleResultVo simpleResultVo = new SimpleResultVo();
        simpleResultVo.success = false;
        // 统计各类字符的数量
        int number = 0;
        int lowerCase = 0;
        int upperCase = 0;
        int specialCase = 0;
        String regex = "^.*[-/^/$/.//,:~`!@#%&/*/|/?/+/_/=/(/)/[/]/{/}]+.*$";
        for (int i = 0; i < password.length(); i++) {
            char ch = password.charAt(i);
            String ch1 = String.valueOf(ch);
            if (ch >= '0' && ch <= '9') {

                number++;

            } else if (ch >= 'a' && ch <= 'z') {

                lowerCase++;

            } else if (ch >= 'A' && ch <= 'Z') {

                upperCase++;

            } else if (ch1.matches(regex)) {

                specialCase++;

扫描二维码关注公众号,回复: 2947932 查看本文章

            } else {
                // logger.info("非法字符"+ch1);
            }
        }
//        System.out.println("number=" + number);
//        System.out.println("lowerCase=" + lowerCase);
//        System.out.println("upperCase=" + upperCase);
//        System.out.println("specialCase=" + specialCase);

        // 获取口令的首尾字符
        char index = password.charAt(0);
        char end = password.charAt(password.length() - 1);
        String index1 = String.valueOf(index);
        String end1 = String.valueOf(end);

        // 口令不少于8位
        if (password.matches("^.{8,}$")) {
            // 口令应该为以下4类字符的组合:大写字母(A-Z)、小写字母(a-z)、数字(0-9)和特殊字符
            if (password.matches("^.*[a-z]+.*$")
                    && password.matches("^.*[A-Z]+.*$")
                    && password.matches("^.*[0-9]+.*$")
                    && password.matches(regex)) {
                // 每类字符至少包含一个,如果某类字符只包含一个,那么该字符不应该为首字符或尾字符。
                if (index >= '0' && index <= '9' && number == 1) {
                    simpleResultVo.message = "口令首字符为数字但数字只有一位";
                } else if (end >= '0' && end <= '9' && number == 1) {
                    simpleResultVo.message = "口令尾字符为数字但数字只有一位";
                } else if (index >= 'a' && index <= 'z' && lowerCase == 1) {
                    simpleResultVo.message = "口令首字符为小写字母但小写字母只有一位";
                } else if (end >= 'a' && end <= 'z' && lowerCase == 1) {
                    simpleResultVo.message = "口令尾字符为小写字母但小写字母只有一位";
                } else if (index >= 'A' && index <= 'Z' && upperCase == 1) {
                    simpleResultVo.message = "口令首字符为大写字母但大写字母只有一位";
                } else if (end >= 'A' && end <= 'Z' && upperCase == 1) {
                    simpleResultVo.message = "口令尾字符为大写字母但大写字母只有一位";
                } else if (index1.matches(regex) && specialCase == 1) {
                    simpleResultVo.message = "口令首字符为特殊字符但特殊字符只有一位";
                } else if (end1.matches(regex) && specialCase == 1) {
                    simpleResultVo.message = "口令尾字符为特殊字符但特殊字符只有一位";
                }

                // 不为重复某些字符的组合(如A1a#A1a#) 2代表某连续两个字符重复(abab)
                if (!password.matches("^.*(.{2})(.*)\\1+.*$")) {

                    //到这之后就需要和数据库里的信息进行比对了,这个代码不通用,根据自己的需求进行修改。

                   //注册时没有个人信息
                    if (authentication == null) {

                        simpleResultVo.message = "口令合法";
                        simpleResultVo.success = true;

                    } else {

                      //修改密码时
                        Map<String, Object> map = authentication
                                .getCurrentAccount().getExtendAttributes();

                        String name = map.get("name").toString();
                        String loginName = map.get("login_name").toString();
                        String idNo = map.get("iddoc_no").toString();
                        String accountId = authentication.getCurrentAccount()
                                .getAccountId();
                        // 不包含本人姓名、出生日期、登录名、email等与本人相关的信息
                        if (!password.equals(name)
                                && !password.equals(loginName)
                                && !password.equals(idNo)) {

                            String pwd = UserCryptoUtils.encode(password);
                            SimpleResultVo resultVo = userPwdHistoryService
                                    .selectPwdHistory(accountId, pwd);
                            // 不为历史口令
                            if (resultVo.success) {
                                simpleResultVo.message = "口令合法";
                                simpleResultVo.success = true;

                            } else {
                                simpleResultVo.message = "历史口令";
                            }

                        } else {
                            simpleResultVo.message = "包含个人信息";
                        }
                    }

                } else {
                    simpleResultVo.message = "字符组合重复";
                }
            } else {
                simpleResultVo.message = "口令未包含四类字符";
            }
        } else {
            simpleResultVo.message = "口令长度不到8位";
        }

        logger.info("口令验证结果:" + simpleResultVo.toString());
        return simpleResultVo;
    }
 

猜你喜欢

转载自blog.csdn.net/deram_strong/article/details/82119640