防止弱口令,密码验证

首先说下需求:

     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++;

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Tomcat弱口令扫描器是一种用于检测Tomcat服务器的弱口令安全风险的工具。由于Tomcat是一款常用的开源Java Web应用服务器,因此存在一些默认用户名和密码弱口令,这些弱口令可能会被攻击者利用来入侵服务器。 Tomcat弱口令扫描器可以帮助管理员及时发现并解决这些安全风险。下载这个扫描器的目的是以防止攻击者利用弱口令入侵服务器,从而保护服务器内部数据的安全。 当我们下载Tomcat弱口令扫描器时,需要注意以下几点: 1. 确保下载源可靠:最好从官方或受信任的软件下载网站上下载,避免从不信任的来源下载,以免下载到篡改或恶意软件。 2. 检查软件完整性:在下载完成后,进行文件的完整性校验,例如使用MD5或SHA-256等哈希算法验证文件的一致性。 3. 安装和配置:根据软件提供的安装说明和用户手册,正确安装和配置扫描器。确保根据实际需求设置扫描器的参数,例如要扫描的目标URL、检测的用户名密码策略等等。 4. 扫描服务器:根据软件的指导,启动扫描器,开始扫描Tomcat服务器。扫描器将会自动或手动检测弱口令,并给出相应的结果报告。 5. 修复安全漏洞:通过查看扫描报告,发现存在弱口令的情况,需要及时修改服务器的口令。根据弱口令扫描器的建议修改服务器密码,确保密码强度,以增强服务器的安全性。 综上所述,下载Tomcat弱口令扫描器是为了帮助我们发现并修复Tomcat服务器默认弱口令安全风险,确保服务器的安全运行。正确选择可靠的渠道进行下载,并遵循软件说明和安全操作指南,能够更好地保护服务器的安全

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值