华为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 }

 

posted on 2016-07-02 16:52  mukekeheart  阅读(2020)  评论(0编辑  收藏  举报