密码强度

本文介绍了一种用于评估密码强度的算法,通过分析密码长度、字符种类(包括大小写字母、数字和符号)来给出安全等级评定,从非常弱到非常安全共七个等级,帮助用户了解其密码的安全性。

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

一、密码长度:

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

数字:-9

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

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

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

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

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

注意

  • 条件中的等于号别忘了取
  • 16进制数能直接使用
import java.util.*;
public class Main{
    public static int lengthScore(String password){
        if(password.length() <= 4){
            return 5;
        }else if(password.length() >= 5 && password.length() <= 7){
            return 10;
        }else{
            return 25;
        }
    }
    public static int alphaScore(String password){
        boolean noAlpha = true;
        boolean littleAlpha = false;
        boolean LargeAlpha = false;
        for(int i = 0; i < password.length();i++){
            if(littleAlpha == true && LargeAlpha == true){
                break;
            }
//注意等于号
            if(password.charAt(i) >= 'a' && password.charAt(i) <= 'z'){
                littleAlpha = true;
                noAlpha = false;
            }
            if(password.charAt(i) >= 'A' && password.charAt(i) <= 'Z'){
                LargeAlpha = true;
                noAlpha = false;
            }
        }
        if(noAlpha == true){
            return 0;
        }else if(littleAlpha && LargeAlpha){
            return 20;
        }else{
            return 10;
        }
        
    }
    public static int numScore(String password){
        int num = 0;
        for(int i = 0; i < password.length();i++){
            if(password.charAt(i) >= '0' && password.charAt(i) <= '9'){
                num++;
            }
        }
        if(num == 0){
            return 0;
        }else if(num == 1){
            return 10;
        }else{
            return 20;
        }
    }
    public static int symbolScore(String password){
        int num = 0;
        for(int i = 0; i < password.length();i++){
            if(password.charAt(i) >= 0x21 && password.charAt(i) <= 0x2f ||
              password.charAt(i) >= 0x3a && password.charAt(i) <= 0x40 ||
              password.charAt(i) >= 0x5b && password.charAt(i) <= 0x60 ||
              password.charAt(i) >= 0x7b && password.charAt(i) <= 0x7e){
                num++;
            }
        }
        if(num == 0){
            return 0;
        }else if(num == 1){
            return 10;
        }else{
            return 25;
        }   
    }
 
    public static int praiseSocre(int alpha, int num, int symbol){
        if(alpha == 10 && num >= 10 && symbol >= 10){
            return 3;
        }
        if(alpha == 20 && num >= 10 && symbol >= 10){
            return 5;
        }
        if(symbol == 0 && num >= 10 && alpha >= 10){
            return 2;
        }
        return 0;
        
    }
    public static String scoreToLevel(int sum){
        if(sum >= 90){
            return "VERY_SECURE";
        }else if(sum >= 80){
            return "SECURE";
        }else if(sum >= 70){
            return "VERY_STRONG";
        }else if(sum >= 60){
           return "STRONG"; 
        }else if(sum >= 50){
            return "AVERAGE";
        } else if(sum >= 25){
            return "WEAK";
        }else{
            return "VERY_WEAK";
        }
    }
    public static String passwordLevel(String password){
      
        int len = lengthScore(password);
        int alpha = alphaScore(password);
        int num  = numScore(password);
        int symbol = symbolScore(password);
        int praise = praiseSocre(alpha, num, symbol);
        int sum = len + alpha + num + symbol + praise;
        return scoreToLevel(sum);
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String password = sc.next();
            String result = passwordLevel(password);
            System.out.println(result);
        }
        sc.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值