华为OJ平台——密码强度等级
题目描述:
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
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_WEAK,
WEAK,
AVERAGE,
STRONG,
VERY_STRONG,
SECURE,
VERY_SECURE
请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./ (ASCII码:x21~0x2F)
:;<=>?@ (ASCII<=><=><=><=><=>码:x3A~0x40)
[\]^_` (ASCII码:x5B~0x60)
{|}~ (ASCII码:x7B~0x7E)
输入:
输入一个string的密码(eg:38$@NoNoNo)
输出:
输出密码等级(eg:VERY_SECURE)
思路:
其实对于这样一个等级评定,主要考察的是密码字符串的长度、大写字母个数、小写字母个数、数字个数以及符号个数,然后根据这些标准来判断得分,最后根据得分来确定等级就可以了。主要是一些if语句的逻辑判断,算法层面的考察很少。
1 import java.util.Scanner; 2 3 public class GetPwdSecurityLevel { 4 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in) ; 7 String password = cin.nextLine() ; 8 cin.close() ; 9 10 SecurityLevel res = getPwdSecurityLevel(password) ; 11 System.out.println(res.name()) ; 12 13 } 14 15 /** 16 * 其实对于这样一个等级评定, 17 * 主要考察的是密码字符串的长度、大写字母个数、小写字母个数、数字个数以及符号个数 18 * 然后根据这些标准来判断得分,最后根据得分来确定等级 19 * @param password 20 * @return 21 */ 22 private static SecurityLevel getPwdSecurityLevel(String password) { 23 int len = password.length() ; 24 int countUpper = 0 ; 25 int countLower = 0 ; 26 int countNum = 0 ; 27 int countSym = 0 ; 28 29 int score = 0 ; 30 char temp ; 31 for(int i = 0 ; i < len ; i++){ 32 temp = password.charAt(i) ; 33 if((temp <= 'Z') && (temp >= 'A')){ 34 //大写字母个数 35 countUpper++ ; 36 }else if((temp <= 'z') && (temp >= 'a')){ 37 //小写字母个数 38 countLower++ ; 39 }else if((temp <= '9') && (temp >= '0')){ 40 //数字个数 41 countNum++ ; 42 }else if(((temp >= 0x21) && (temp <= 0x2F)) || 43 ((temp >= 0x3A) && (temp <= 0x40)) || 44 ((temp >= 0x7B) && (temp <= 0x7E))){ 45 //符号个数 46 countSym++ ; 47 } 48 } 49 50 //计算根据长度判断的得分 51 if(len <= 4){ 52 score += 5 ; 53 }else if((len <= 7) && (len > 4)){ 54 score += 10 ; 55 }else{ 56 score += 25 ; 57 } 58 //计算根据字母情况判断得分 59 if(((countUpper != 0) && (countLower == 0)) || 60 ((countUpper == 0) && (countLower != 0))){ 61 score += 10 ; 62 }else if((countUpper != 0) && (countLower != 0)){ 63 score += 20 ; 64 } 65 //计算根据数字个数判断得分 66 if(countNum == 1){ 67 score += 10 ; 68 }else if(countNum > 1){ 69 score += 20 ; 70 } 71 //计算根据符号个数判断的得分 72 if(countSym == 1){ 73 score += 10 ; 74 }else if(countSym > 1){ 75 score += 25 ; 76 } 77 //计算奖励的判断得分 78 if((countUpper != 0) && (countLower != 0) && 79 (countNum != 0) && (countSym != 0)){ 80 score += 5 ; 81 }else if(((countUpper + countLower) != 0) && 82 (countNum != 0) && (countSym != 0)){ 83 score += 3 ; 84 }else if(((countUpper + countLower) != 0) && 85 (countNum != 0) && (countSym == 0)){ 86 score += 2 ; 87 } 88 //根据得分确定最后的评级,并返回 89 if(score >= 90){ 90 return SecurityLevel.VERY_SECURE ; 91 }else if(score >= 80){ 92 return SecurityLevel.SECURE ; 93 }else if(score >= 70){ 94 return SecurityLevel.VERY_STRONG ; 95 }else if(score >= 60){ 96 return SecurityLevel.STRONG ; 97 }else if(score >= 50){ 98 return SecurityLevel.AVERAGE ; 99 }else if(score >= 25){ 100 return SecurityLevel.WEAK ; 101 }else{ 102 return SecurityLevel.VERY_WEAK ; 103 } 104 105 } 106 107 } 108 109 /** 110 * 安全评级用枚举类型表示 111 */ 112 enum SecurityLevel{ 113 VERY_WEAK, 114 WEAK, 115 AVERAGE, 116 STRONG, 117 VERY_STRONG, 118 SECURE, 119 VERY_SECURE 120 }