【Java练习题】密码强度等级

该博客介绍了一种使用Java对密码强度进行评分的方法,包括密码长度、字母、数字、符号等因素。根据评分标准,密码被划分为非常安全、安全、非常强、强、一般、弱和非常弱七个等级。文章提供了具体的ASCII符号范围,并给出多组输入输出示例。

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:

5 分: 小于等于4 个字符

10 分: 5 到7 字符

25 分: 大于等于8 个字符

二、字母:

0 分: 没有字母

10 分: 全都是小(大)写字母

20 分: 大小写混合字母

三、数字:

0 分: 没有数字

10 分: 1 个数字

20 分: 大于1 个数字

四、符号:

0 分: 没有符号

10 分: 1 个符号

25 分: 大于1 个符号

五、奖励(只能选符合最多的那一种奖励):

2 分: 字母和数字

3 分: 字母、数字和符号

5 分: 大小写字母、数字和符号

最后的评分标准:

>= 90: 非常安全

>= 80: 安全(Secure)

>= 70: 非常强

>= 60: 强(Strong)

>= 50: 一般(Average)

>= 25: 弱(Weak)

>= 0:  非常弱

对应输出为:

VERY_SECURE

SECURE

VERY_STRONG

STRONG

AVERAGE

WEAK

VERY_WEAK


请根据输入的密码字符串,进行安全评定。

注:

字母:a-z, A-Z

数字:0-9

符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)

!"#$%&'()*+,-./     (ASCII码:0x21~0x2F)

:;<=>?@             (ASCII码:0x3A~0x40)

[\]^_`              (ASCII码:0x5B~0x60)

{|}~                (ASCII码:0x7B~0x7E)

提示:

1 <= 字符串的长度<= 300

输入描述:

本题含有多组输入样例。
每组样例输入一个string的密码

输出描述:

每组样例输出密码等级

示例1

输入:

38$@NoNoNo

输出:

VERY_SECURE

说明:

第一组样例的密码长度大于等于8个字符,得25分;大小写字母都有所以得20分;有两个数字,所以得20分;包含大于1符号,所以得25分;由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分。
同理,第二组样例密码强度为5+0+20+0+0=25分。       

示例2

输入:

Jl)M:+

输出:

AVERAGE

说明:

示例2的密码强度为10+20+0+25+0=55分。

代码:

import java.util.Scanner;
public class Main {
    static int pLength(StringBuilder passwd) {//判断字符串长度
        if (passwd.length() <= 4) {
            return 5;//小于四则返回5
        } else if(passwd.length() >= 8) {
            return 25;
        } else {
            return 10;
        }
    }
    static int pABC(StringBuilder passwd) {
        int big = 0;
        int small = 0;//两个数判断大小写字母的个数
        for (int i = 0; i < passwd.length(); i++) {
            if ((int) passwd.charAt(i) >= 65 && (int) passwd.charAt(i) <= 90) {//为大写
                big++;
            } else if ((int) passwd.charAt(i) >= 97 && (int) passwd.charAt(i) <= 122) {
                small++;//小写
            }
        }
        if (small == passwd.length() && big == 0) {//全小
            return 10;
        } else if (small == 0 && big == passwd.length()) {//全大
            return 10;
        } else if (small > 0 && big > 0) {//大小混合
            return 20;
        }
        return 0;//上面三种都没返回只能是没有字母了
    }
    static int pNumber(StringBuilder passwd) {//判断数字
        int num = 0;
        for (int i = 0; i < passwd.length(); i++) {
            if ((int)passwd.charAt(i) >= 48 && (int)passwd.charAt(i) <= 57) {
                num++;
            }
        }
        if (num == 0) {
            return 0;
        } else if (num == 1) {
            return 10;
        }
        return 20;//大于1个数字
    }
    static int pSymbol(StringBuilder passwd) {//判断符号
        int symbol = 0;
        for (int i = 0; i < passwd.length(); i++) {
            if ((int)passwd.charAt(i) >= 33 && (int)passwd.charAt(i) <= 47) {
                symbol++;
            } else if ((int)passwd.charAt(i) >= 58 && (int)passwd.charAt(i) <= 64){
                symbol++;
            } else if ((int)passwd.charAt(i) >= 91 && (int)passwd.charAt(i) <= 96){
                symbol++;
            } else if((int)passwd.charAt(i) >= 123 && (int)passwd.charAt(i) <= 126){
                symbol++;
            }
        }
        if (symbol == 0) {
            return 0;
        } else if (symbol == 1) {
            return 10;
        }
        return 25;//大于一个符号
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuilder passwd = new StringBuilder(in.next());
        int score = 0;
        int reward = 0;
        if (pABC(passwd) == 20 && pNumber(passwd) > 0 && pSymbol(passwd) >0) {
            reward = 5;
        } else if (pABC(passwd) == 10 && pNumber(passwd) > 0 && pSymbol(passwd) >0) {
            reward = 3;
        } else if (pABC(passwd) == 10 && pNumber(passwd) > 0) {
            reward = 2;
        }
        score += pLength(passwd) + pABC(passwd) + pNumber(passwd) + pSymbol(passwd) + reward;
        if (score >= 90) {
            System.out.println("VERY_SECURE");
        } else if (score >= 80) {
            System.out.println("SECURE");
        } else if (score >= 70) {
            System.out.println("VERY_STRONG");
        } else if (score >= 60) {
            System.out.println("STRONG");
        } else if (score >= 50) {
            System.out.println("AVERAGE");
        } else if (score >= 25) {
            System.out.println("WEAK");
        } else if (score >= 0) {
            System.out.println("VERY_WEAK");
        }
    }
}

输出结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值