首页 > 试题广场 >

密码强度等级

[编程题]密码强度等级
  • 热度指数:143992 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:
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)

对应输出为:

VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK

请根据输入的密码字符串,进行安全评定。

注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#$%&'()*+,-./     (ASCII码:0x21~0x2F)
:;<=>?@             (ASCII码:0x3A~0x40)
[\]^_`              (ASCII码:0x5B~0x60)
{|}~                (ASCII码:0x7B~0x7E)

提示:
1 <= 字符串的长度<= 300

输入描述:

输入一个string的密码



输出描述:

输出密码等级

示例1

输入

38$@NoNoN

输出

VERY_SECURE

说明

样例的密码长度大于等于8个字符,得25分;大小写字母都有所以得20分;有两个数字,所以得20分;包含大于1符号,所以得25分;由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分。
         
示例2

输入

Jl)M:+

输出

AVERAGE

说明

示例2的密码强度为10+20+0+25+0=55分。        
var pwd=readline();
var n=0;
var isLeng=false;
var isUeng=false;
var isNum=false;
var isZf=false;
//长度
if(pwd.length>=8){
    n+=25;
}else if(pwd.length>=5){
    n+=10;
}else{
    n+=5;
}
//字母
if(pwd.match(/[a-z]/g)!=null){
    n+=10;isLeng=true;
}
if(pwd.match(/[A-Z]/g)!=null){
    n+=10;isUeng=true;
}
//数字
if(pwd.match(/[0-9]/g)!=null){
    if(pwd.match(/[0-9]/g).length>1){
        n+=20;
    }else{
        n+=10;
    }
    isNum=true;
}
//符号
if(pwd.length-pwd.match(/[a-zA-z0-9]/g).length>1){
    n+=25;isZf=true;
}else if(pwd.length-pwd.match(/[a-zA-z0-9]/g).length==1){
    n+=10;isZf=true;
}
//奖励
if(isLeng && isUeng && isNum && isZf){
    n+=5;
}else if((isLeng || isUeng) && isNum && isZf){
    n+=3
}else if((isLeng || isUeng) && isNum){
    n+=2
}
switch(true){
    case (n>=90): console.log("VERY_SECURE");break;
    case (n>=80): console.log("SECURE");break;
    case (n>=70): console.log("VERY_STRONG");break;
    case (n>=60): console.log("STRONG");break;
    case (n>=50): console.log("AVERAGE");break;
    case (n>=25): console.log("WEAK");break;
    case (n>=0): console.log("VERY_WEAK");break;
}
发表于 2022-05-20 16:53:54 回复(0)
const pwd = readline();

let score = 0;

const len = pwd.length;
if (len <= 4) {
  score += 5;
} else if (len <= 7) {
  score += 10;
} else {
  score += 25;
}

if (!/[a-zA-Z]/.test(pwd)) {
} else {
  if (/[a-z]/.test(pwd)) {
    score += 10;
  }
  if (/[A-Z]/.test(pwd)) {
    score += 10;
  }
}

const hasNum = pwd.match(/[0-9]/g);

if (!hasNum) {
} else if (hasNum.length === 1) {
  score += 10;
} else if (hasNum.length > 1) {
  score += 20;
}

const hasChar = pwd.match(/[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/g);

if (!hasChar) {
} else if (hasChar.length === 1) {
  score += 10;
} else if (hasChar.length > 1) {
  score += 25;
}

if (
  /[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/.test(pwd) &&
  /[A-Z]/.test(pwd) &&
  /[a-z]/.test(pwd) &&
  /[0-9]/.test(pwd)
) {
  score += 5;
} else if (
  /[a-zA-Z]/.test(pwd) &&
  /[0-9]/.test(pwd) &&
  /[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/.test(pwd)
) {
  score += 3;
} else if (/[a-zA-Z]/.test(pwd) && /[0-9]/.test(pwd)) {
  score += 2;
}

if (score >= 90) {
  console.log("VERY_SECURE");
} else if (score >= 80) {
  console.log("SECURE");
} else if (score >= 70) {
  console.log("VERY_STRONG");
} else if (score >= 60) {
  console.log("STRONG");
} else if (score >= 50) {
  console.log("AVERAGE");
} else if (score >= 25) {
  console.log("WEAK");
} else if (score >= 0) {
  console.log("VERY_WEAK");
}

发表于 2022-04-24 17:13:28 回复(0)
var read
while(read = readline()) {
    console.log(getLevel(read))
}

function getLevel(readStr) {
    // 统计输入字符的小写字母,大写字母,数字,特殊字符的个数
    var obj = {
        "daxiaoZimu":0,
        "xiaoxieZimu":0,
        "shuZi":0,
        "teShuzifu":0
    }
    var readStrArr = readStr.split('')
    for(let item of readStrArr) {
       if(item >= 'a' && item <= 'z' ){
            obj.xiaoxieZimu += 1;
            continue;
        }
        
        if(item >= 'A' && item <= 'Z'){
            obj.daxiaoZimu += 1;
            continue;
        }
        
        if(item >= '0' && item <= '9'){
            obj.shuZi += 1;
            continue;
        }
        
        obj.teShuzifu += 1; 
    }
    var score = 0
    // 密码长度
    if(readStr.length <= 4) {
        score += 5
    } else if(readStr.length <= 7 && readStr.length >= 5) {
        score += 10
    } else if(readStr.length >= 8) {
        score += 25
    }
    
    // 全是小写 全是大写
    if((obj.daxiaoZimu > 0 && obj.xiaoxieZimu === 0) || (obj.daxiaoZimu === 0 && obj.xiaoxieZimu > 0)) {
         score += 10
    }
//     if((obj.daxiaoZimu > 0 && obj.xiaoxieZimu === 0 && obj.shuZi === 0 && obj.teShuzifu === 0)
//        || (obj.xiaoxieZimu > 0 && obj.daxiaoZimu === 0 && obj.shuZi === 0 && obj.teShuzifu === 0)) {
//          score += 10
//     }
    // 大小写字母混合
    if(obj.daxiaoZimu > 0 && obj.xiaoxieZimu > 0) {
         score += 20
    }
     // 一个数字
    if(obj.shuZi === 1) {
        score += 10
    }
    // 大于1个数字
    if(obj.shuZi > 1) {
        score += 20
    }
    // 1个符号
    if(obj.teShuzifu === 1) {
        score += 10
    }
    // 大于1个符号
     if(obj.teShuzifu > 1) {
        score += 25
    }
    // 字母和数字
    if((obj.daxiaoZimu > 0 && obj.shuZi > 0 && obj.xiaoxieZimu === 0 && obj.teShuzifu === 0)
      || (obj.xiaoxieZimu > 0 && obj.shuZi > 0 && obj.daxiaoZimu === 0 && obj.teShuzifu === 0)){
        score += 2
    }
    
    // 字母数字和符号
     if((obj.daxiaoZimu > 0 && obj.shuZi > 0 && obj.xiaoxieZimu === 0 && obj.teShuzifu > 0)
      || (obj.xiaoxieZimu > 0 && obj.shuZi > 0 && obj.daxiaoZimu === 0 && obj.teShuzifu > 0)){
        score += 3
     }
    
    // 大小写字母数字和符号
     if(obj.daxiaoZimu > 0 && obj.shuZi > 0 && obj.xiaoxieZimu > 0 && obj.teShuzifu > 0){
        score += 5
     }
    var tip = ''
    if(score >= 95){
        tip = 'VERY_SECURE'
    } else if(score >= 80 && score < 95) {
        tip = 'SECURE'
    } else if(score >= 70 && score < 80) {
        tip = 'VERY_STRONG'
    } else if(score >= 60 && score < 70) {
        tip = 'STRONG'
    } else if(score >= 50 && score < 60) {
        tip = 'AVERAGE'
    } else if(score >= 25 && score < 50) {
        tip = 'WEAK'
    } else {
        tip = 'VERY_WEAK'
    }
//     console.log(score)
    return tip
}
// 25+20+25+3
发表于 2021-10-03 23:41:52 回复(0)