zoukankan      html  css  js  c++  java
  • 华为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 }
  • 相关阅读:
    dubbo里面的JavaBeanDescriptor是怎么进行序列化和反序列化的?
    为什么dubbo的调用重试不建议设置成超过1
    dubbo中registry、route、directory、cluster、loadbalance、route的关系以及一个引用操作和调用操作到底干了啥
    技术博客-1 DRF框架下的图片(文件)上传
    Scrum meeting 1
    beta设计和计划
    事后分析$alpha$
    项目展示$alpha$
    帮助文档
    发布声明α
  • 原文地址:https://www.cnblogs.com/mukekeheart/p/5635650.html
Copyright © 2011-2022 走看看