java简单密码校验工具类及弱密码说明

1.连续性弱密码校验

描述:密码连续性校验是指123456,654321,abcdefg,gfedcba等数字和字母顺序是连续的字符称之为连续性弱密码。

校验方式:PassWordUtil.java通用类中的check_numl方法

方法说明:

/**
 * 密码连续性验证 连续字符串返回true
 * @param password 传入的校验字符串
 * @return
 */

 

2.重复性弱密码校验

描述:密码重复性校验是指11111,2222,aaaa,bbbbb等数字和字母都是相同字符称之为重复性弱密码。

校验方式:PassWordUtil.java通用类中的check_numz方法

方法说明:

/**
 * 密码重复性验证 重复字符串返回true
 * @param password 传入的校验字符串
 * @return
 */

3.密码必须字母和数字组合校验

描述:密码格式必须是字母+数据的组合,不能全是数字或者字母。

校验方式:PassWordUtil.java通用类中的isLetterDigit方法

方法说明:

/**
 * 判断字符串是否同时包含数字和字母
 * @param str  传入的校验字符串
 * @return true 正确 false 错误
 */

 

下面是PassWordUtil.java工具类代码

package com.netmarch.web.common.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * 密码字符验证类
 */
public class PassWordUtil {
    /**
     * 密码连续性验证 连续字符串返回true
     * @param password 传入的校验字符串
     * @return
     */
    public static boolean check_numl(String password){
        boolean is = true;
        String v = isCf(password);
        if("4".equals(v)){
            return false;
        }else {
            return simpleLetterAndNumCheck(password,password.length());
        }
    }

    /**
     * 判断字符串是否同时包含数字和字母
     * @param str  传入的校验字符串
     * @return true 正确 false 错误
     */
    public static boolean isLetterDigit(String str) {
        String regex = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+$";
        return str.matches(regex);
    }

    /**
     * 密码重复性验证 重复字符串返回true
     * @param password 传入的校验字符串
     * @return
     */
    public static boolean check_numz(String password){
        char [] value = password.toCharArray();
        List<String> list = new ArrayList<>();
        for (char c : value) {
            list.add( String.valueOf(c));
        }
//        Map<String, Long> map = new HashMap<>();
        Map<String, Long> map = list.stream().collect(Collectors.groupingBy(p -> p, Collectors.counting()));
        map.forEach((k, v) -> System.out.println(k + ":" + v));

        return map.size() == 1;
    }

    /**
     * 校验字符串连续多少位是纯数字或者纯字母(字母区分大小写)
     * @param value 密码
     * @param length 校验长度,默认6为
     * @return
     */
    public static boolean simpleLetterAndNumCheck(String value, int length){
        //是否不合法
        boolean isValidate = false;
        //
        int i = 0;
        //计数器
        int counter = 1;
        //
        for(; i < value.length() -1;) {
            //当前ascii值
            int currentAscii = Integer.valueOf(value.charAt(i));
            //下一个ascii值
            int nextAscii = Integer.valueOf(value.charAt(i + 1));
            //满足区间进行判断
            if( (PassWordUtil.rangeInDefined(currentAscii, 48, 57) || PassWordUtil.rangeInDefined(currentAscii, 65, 90) || PassWordUtil.rangeInDefined(currentAscii, 97, 122))
                    && (PassWordUtil.rangeInDefined(nextAscii, 48, 57) || PassWordUtil.rangeInDefined(nextAscii, 65, 90) || PassWordUtil.rangeInDefined(nextAscii, 97, 122)) ) {
                //计算两数之间差一位则为连续
                if(Math.abs((nextAscii - currentAscii)) == 1){
                    //计数器++
                    counter++;
                }else{
                    //否则计数器重新计数
                    counter = 1;
                }
            }
            //满足连续数字或者字母
            if(counter >= length) return !isValidate;
            //
            i++;
        }

        //
        return isValidate;
    }

    /**
     * 判断一个数字是否在某个区间
     * @param current 当前比对值
     * @param min   最小范围值
     * @param max   最大范围值
     * @return
     */
    public static boolean rangeInDefined(int current, int min, int max) {
        //
        return Math.max(min, current) == Math.min(current, max);
    }


    /**
     * 判断字符重复性
     * @param str
     * @return 1 大写重复字母 2小写重复字母 3数字重复 4非重复数据
     */
    public static String isCf(String str) {
        Pattern pattern1 = Pattern.compile("[a-z]*");
        Pattern pattern2 = Pattern.compile("[A-Z]*");
        Pattern pattern3 = Pattern.compile("[0-9]*");
        Matcher matcher1 = pattern1.matcher(str);
        Matcher matcher2 = pattern2.matcher(str);
        Matcher matcher3 = pattern3.matcher(str);
        if (matcher1.matches()) {
            return "1";
        } else if (matcher2.matches()) {
            return "2";
        } else if (matcher3.matches()) {
            return "3";
        } else {
            return "4";
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值