|
题目描述:
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
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 } |
|
|