首页 > 试题广场 >

密码强度等级

[编程题]密码强度等级
  • 热度指数:144005 时间限制: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分。        
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    let str=await readline();
    let score=check(str);
    let res="";
    if(score>=90) res="VERY_SECURE";
    else if(score>=80) res="SECURE";
    else if(score>=70) res="VERY_STRONG";
    else if(score>=60) res="STRONG";
    else if(score>=50) res="AVERAGE";
    else if(score>=25) res="WEAK";
    else res="VERY_WEAK";

    console.log(res);
}()

let check=function(s){
    let map={num:0,up_letter:0,low_letter:0,symbol:0};
    for(let val of s){
        let num=val.charCodeAt();
        if(num>=97&&num<=122) map.low_letter+=1;
        else if(num>=65&&num<=90) map.up_letter+=1;
        else if(num>=48&&num<=57) map.num+=1;
        else map.symbol+=1;
    }

    let cnt=0;

    let len=s.length;
    if(len<=4) cnt+=5;
    else if(len<=7) cnt+=10;
    else cnt+=25;

    if(map.low_letter!=0&&map.up_letter!=0) cnt+=20;
    else if(map.low_letter!=0||map.up_letter!=0) cnt+=10;

    if(map.num>1) cnt+=20;
    else if(map.num==1) cnt+=10;

    if(map.symbol>1) cnt+=25;
    else if(map.symbol==1) cnt+=10;

    if(map.num!=0&&map.up_letter!=0&&map.low_letter!=0&&map.symbol!=0) cnt+=5;
    else if((map.up_letter!=0||map.low_letter!=0)&&map.num!=0&&map.symbol!=0) cnt+=3;
    else if((map.up_letter!=0||map.low_letter!=0)&&map.num!=0) cnt+=2;

    return cnt;
}

发表于 2022-11-11 22:26:22 回复(0)
算法不强,耐心些if else 中可以过
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
const len = function (passcode) {
  const len = passcode.length;
  if (len <= 4 && len > 0) {
    return 5;
  } else if (len >= 5 && len <= 7) {
    return 10;
  } else {
    return 25;
  }
};
const hasCase = function (passcode) {
  if (/[A-Za-z]/g.test(passcode)) {
    const small = passcode.split("").some((item) => {
      const code = item.charCodeAt();
      return 97 <= code && code <= 122;
    });
    const big = passcode.split("").some((item) => {
      const code = item.charCodeAt();
      return 65 <= code && code <= 90;
    });
    if (small && big) {
      return 20;
    } else {
      return 10;
    }
  } else {
    return 0;
  }
};
const hasNum = function (passcode) {
  if (/[0-9]/g.test(passcode)) {
    const len = passcode.replace(/[^0-9]/g, "").length;
    if (len === 1) {
      return 10;
    } else {
      return 20;
    }
  } else{
      return 0
  }
};
const hasSymb = function (passcode) {
  if (/\W/g.test(passcode)) {
    const len = passcode.replace(/\w/g, "").length;
    if (len === 1) {
      return 10;
    } else {
      return 25;
    }
  } else {
    return 0;
  }
};
const hasjinali = function (passcode) {
  const char = hasCase(passcode);
  const num = hasNum(passcode);
  const syb = hasSymb(passcode);
  const lencount = len(passcode);
  if (char === 20 && num >= 10 && syb >= 10) {
    return char + num + syb + 5 + lencount;
  } else if (char === 10 && num >= 10 && syb >= 10) {
    return char + num + syb + 3 + lencount;
  } else if (char >= 10 && num >= 10) {
    return char + num + syb + 2 + lencount;
  } else {
    return char + num + syb + lencount;
  }
};
rl.on("line", function (line) {
  const s = hasjinali(line);
  if (s >= 90) {
    console.log("VERY_SECURE");
  } else if (s >= 80) {
    console.log("SECURE");
  } else if (s >= 70) {
    console.log("VERY_STRONG");
  } else if (s >= 60) {
    console.log("STRONG");
  } else if (s >= 50) {
    console.log("AVERAGE");
  } else if (s >= 25) {
    console.log("WEAK");
  } else {
    console.log("VERY_WEAK");
  }
});


发表于 2022-06-08 22:14:40 回复(0)
const readline = require('readline')
const rl = readline.createInterface({
    input:process.stdin,
    output:process.stdout
})

let count = 0
//借用
rl.on('line',function(line){
    count = checkLen(line) + checkLetter(line) + checkNum(line) + checkSpec(line)
    if(checkLetter(line) == 20 && checkNum(line) && checkSpec(line)){
        count += 5
    }else if(checkLetter(line) == 10 && checkNum(line) && checkSpec(line)){
        count += 3
    }else if(checkLetter(line) == 10 && checkNum(line)){
        count += 2
    }
    if(count >= 90){
        console.log('VERY_SECURE')
    }else if(count >= 80){
        console.log('SECURE')
    }else if(count >= 70){
        console.log('VERY_STRONG')
    }else if(count >= 60){
        console.log('STRONG')
    }else if(count >= 50){
        console.log('AVERAGE')
    }else if(count >= 25){
        console.log('WEAK')
    }else{
        console.log('VERY_WEAK')
    }
    count = 0
})

const checkLen = function(str){
    if(str.length<=4){
        return 5
    }else if(str.length<=7){
        return 10
    }else{
        return 25
    }
}

const checkLetter = function(str){
    if(!(/[a-zA-z]/.test(str))){
        return 0
    }else if(/[a-z]/.test(str) && !(/[A-Z]/.test(str)) || !(/[a-z]/.test(str)) && /[A-Z]/.test(str)){
        return 10
    }else{
        return 20
    }
}

const checkNum = function(str){
    const res = str.match(/\d/g)
    if(!res){
        return 0
    }else if(res.length == 1){
        return 10
    }else{
        return 20
    }
}

const checkSpec = function(str){
    const res = str.match(/[^0-9a-zA-Z]/g)
    if(!res){
        return 0
    }else if(res.length == 1){
        return 10
    }else{
        return 25
    }
}

发表于 2021-11-27 19:11:19 回复(0)

3 分: 字母、数字和符号

5 分: 大小写字母、数字和符号
这两个规则怎么理解?
发表于 2021-01-27 15:15:28 回复(0)
while(line = readline()){
    var lowers = /^[a-z]$/;
    var ups = /^[A-Z]$/;
    var ls  = 0;
    var us  = 0;
    var n = /^[0-9]$/;
    var ns = 0;
    var ct = new RegExp("[`~!@%#$^&*()=|{}':;'_, \\[\\]<>/?\\.]");
    var cts = 0;
    var arr = line.split("");
    var len = arr.length;
    var score = 0;
    if(len<=4){
        score = 5;
    }else if(len>=5&&len<=7){
        score = 10;
    }else if(8<=len){
        score = 25;
    }
    for(var i=0; i < arr.length;i++){
       const item = arr[i];
       if(!isNaN(Number(item))){
           
           if(ns){
               ns=20;
           }else{
               ns =10;
           }
       } else if(ups.test(item)){
           us=10;
       }else if(lowers.test(item)){
           ls=10;
       }else if(ct.test(item)){
           if(cts){
              cts=25;
           }else{
               cts=10;
           }
       }
    }

    if(ns&&(us||ls)){
        
        if(ns&&(us||ls)&&cts){
          if(ns&&us&&ls&&cts){
          score =  score + 5;
         }else{
             score =  score + 3;
         }
        }else{
           score =  score + 2; 
        }
    }
    
    
//     console.log(score);
    score = score + ns + us + ls + cts;
//     console.log(cts);
//     console.log(ns);
//     console.log(us);
//     console.log(ls);
//     console.log(score);
    if(score >= 90){
        console.log("VERY_SECURE");
    }else if(score<90 && score>=80){
        console.log("SECURE");
    }else if(score<80 && score>=70){
        console.log("VERY_STRONG");
    }else if(score<70 && score>=60){
        console.log("STRONG");
    }else if(score<60 && score>=50){
        console.log("AVERAGE");
    }else if(score<50 && score>=25){
        console.log("WEAK");
    }else if(score<25 && score>=0){
        console.log("VERY_WEAK");
    }
}


发表于 2020-11-22 17:58:11 回复(0)
var line
while(line=readline()){
    var score=0;
    var len=line.length;
    //长度验证
    if(len<=4){
        score=score+5;
    }else if(5<=len&&len<=7){
        score=score+10;
    }else{
        score=score+25;
    }
    //字母验证
    if(!/[A-Za-z]+/g.test(line)){
        score=score+0;
    }else if(/[a-z]+/g.test(line)&&/[A-Z]+/g.test(line)){
        score=score+20;
    }else{
        score=score+10;
    }
    //数字
    if(!/\d+/g.test(line)){
        score=score+0;
    }else if(/\d{2,}/g.test(line)){
        score=score+20;
    }else{
        score=score+10;
    }
    //符号
    const res=line.replace(/[a-zA-Z0-9]/g,'');//将字符用‘’替换,得到的res长度
    const len1=res.length
    if(len1===0){
        score=score+0;
    }
    if(len1===1){
        score=score+10;
    }
    if(len1>1){
        score=score+25;
    }
    //奖励
    if(/[A-Z]/g.test(line)&&/[a-z]/g.test(line)&&/\d+/g.test(line)&&len1>0)score=score+5;
     else if(/[A-Za-z]/g.test(line) && /\d+/g.test(line)&&len1>0) score=score+3;
     else if(/[A-Za-z]/g.test(line) && /\d+/g.test(line)&&len1===0) score=score+2;
    var result='';
    if(score >= 90) result = 'VERY_SECURE';
     else if(score >= 80) result = 'SECURE';
     else if(score >= 70) result = 'VERY_STRONG';
     else if(score >= 60) result = 'STRONG';
     else if(score >= 50) result = 'AVERAGE';
     else if(score >= 25) result = 'WEAK';
     else result = 'VERY_WEAK';
     print(result);
}
在最后验证的时候,注意从最大情况开始验证
发表于 2020-08-24 23:02:24 回复(0)
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});
 
const regex = /([a-z])|([A-Z])|([0-9])|(\W)/g;
let m;
 
const scoreMap = {
  90: "VERY_SECURE",
  80: "SECURE",
  70: "VERY_STRONG",
  60: "STRONG",
  50: "AVERAGE",
  25: "WEAK",
  0: "VERY_WEAK",
};
 
let count_time = {
  number_time: 0,
  lowercase_time: 0,
  uppercase_time: 0,
  symbol_time: 0,
};
 
function calc(str) {
  while ((m = regex.exec(str)) !== null) {
    if (m.index === regex.lastIndex) {
      regex.lastIndex++;
    }
 
    m.forEach((match, groupIndex) => {
      if (match) {
        switch (groupIndex) {
          case 1:
            count_time.lowercase_time++;
            break;
          case 2:
            count_time.uppercase_time++;
            break;
          case 3:
            count_time.number_time++;
            break;
          case 4:
            count_time.symbol_time++;
            break;
          default:
            break;
        }
      }
    });
  }
}
function review(
  line,
  lowercase_time,
  uppercase_time,
  number_time,
  symbol_time
) {
  let score = 0;
  if (line.length <= 4) score = score + 5;
  if (line.length >= 5 && line.length <= 7) score = score + 10;
  if (line.length >= 8) score = score + 25;
  // 字母
  if (
    (uppercase_time === 0 && lowercase_time !== 0) ||
    (lowercase_time === 0 && uppercase_time === 0)
  ) {
    score = score + 10;
  } else if (uppercase_time !== 0 && lowercase_time !== 0) {
    score = score + 20;
  }
  // 数字
  if (number_time === 1) {
    score = score + 10;
  } else if (number_time > 1) {
    score = score + 20;
  }
  // 符号
  if (symbol_time === 1) {
    score = score + 10;
  } else if (symbol_time > 1) {
    score = score + 25;
  }
  // 奖励
  if (uppercase_time && lowercase_time && number_time && symbol_time) {
    score = score + 5;
  } else if ((uppercase_time || lowercase_time) && number_time && symbol_time) {
    score = score + 3;
  } else if ((uppercase_time || lowercase_time) && number_time) {
    score = score + 2;
  }
  let f = Math.floor(score / 10) * 10;
//   console.log(score);
  return scoreMap[f] || (score < 25 ? "VERY_WEAK" : "WEAK");
}
 
// let scoreLevel = review(
//   count_time.lowercase_time,
//   count_time.uppercase_time,
//   count_time.number_time,
//   count_time.symbol_time
// );
 
// console.log(scoreLevel)
 
rl.on("line", function (line) {
  calc(line);
  console.log(
    review(
      line,
      count_time.lowercase_time,
      count_time.uppercase_time,
      count_time.number_time,
      count_time.symbol_time
    )
  );
//   console.log(count_time);
  count_time = {
    number_time: 0,
    lowercase_time: 0,
    uppercase_time: 0,
    symbol_time: 0,
  };
});
 
//Aa1(

编辑于 2020-08-21 13:53:23 回复(0)
while(line=readline()) {
    let strList = line.split('');
    let upperLettersCount = 0;
    let lowerLettersCount = 0;
    let numbersCount = 0;
    let charactersCount = 0;
    for (let i = 0; i < strList.length; i++) {
      if (strList[i] >= 'A' && strList[i] <= 'Z') {
        upperLettersCount++;
      } else if (strList[i] >= 'a' && strList[i] <= 'z') {
        lowerLettersCount++;
      } else if (strList[i] >= '0' && strList[i] <= '9') {
        numbersCount++;
      }
    }
    charactersCount = strList.length - upperLettersCount - lowerLettersCount - numbersCount;
    let score = 0;
    if (strList.length < 5) {
      score = 5;
    } else if (strList.length < 8) {
      score = 10;
    } else if (strList.length > 8) {
      score = 25;
    }
    let letterStatus = 0;
    if (upperLettersCount > 0 && lowerLettersCount > 0) {
      score += 20
      letterStatus = 2;
    } else if ((upperLettersCount > 0 && !lowerLettersCount) || (lowerLettersCount > 0 && !upperLettersCount)) {
      score += 10;
      letterStatus = 1;
    }

    if (numbersCount == 1) {
      score += 10
    } else if (numbersCount > 1) {
      score += 20
    }

    if (charactersCount == 1) {
      score += 10
    } else if (charactersCount > 1) {
      score += 25
    }
    if (letterStatus > 0 && numbersCount && !charactersCount) {
      score += 2
    } else if (letterStatus == 1 && numbersCount && charactersCount) {
      score += 3
    } else if (letterStatus == 2 && numbersCount && charactersCount) {
      score += 5
    }
    let result = '';
    switch(parseInt(score/10)) {
      case 0: result = 'VERY_WEAK';break;
      case 1: case 2: result = 'WEAK';break;
      case 3: case 4: case 5: result = 'AVERAGE';break;
      case 6: result = 'STRONG';break;
      case 7: result = 'VERY_STRONG';break;
      case 8: result = 'SECURE';break;
      case 9: result = 'VERY_SECURE';break;
    }
    print(result)
}
发表于 2020-07-04 13:29:59 回复(0)
while(line = readline()) {
    let score = 0;
    let tempArrUpp = '';
    let tempArrLow = '';
    let tempArrNum = '';
    let tempArrSym = '';
    /*check password length*/
    if(line.length <= 4) {
        score += 5;
    } else if (line.length >= 5 && line.length <= 7) {
        score += 10;
    } else if (line.length >= 8) {
        score += 25;
    };
    /*check if letters exist*/
    if (line.match(/[A-Z]/g)) {
        tempArrUpp += line.match(/[A-Z]/g).join('');
    };
    if (line.match(/[a-z]/g)) {
        tempArrLow += line.match(/[a-z]/g).join('');
    };
    if (tempArrUpp.length == line.length) {
        score += 10;
    } else if( tempArrUpp && tempArrUpp.length != line.length){
        score += 20;
    } else if (tempArrLow.length == line.length){
        score += 10;
    } else if( tempArrLow && tempArrLow.length != line.length){
        score += 20;
    };
    /*check if numbers exist*/
    if (line.match(/[0-9]/g)) {
        tempArrNum += line.match(/[0-9]/g).join('');
    };
    if (tempArrNum.length == 1) {
        score += 10;
    } else if (tempArrNum.length > 1) {
        score += 20;
    };
    /*check if symbols exit*/
    if (line.match(/[^a-zA-Z0-9\s]/g)) {
        tempArrSym += line.match(/[^a-zA-Z0-9\s]/g).join('');
    };
    if (tempArrSym.length == 1) {
        score += 10;
    } else if (tempArrSym.length > 1) {
        score += 25;
    };
    /*bonus points*/
    if ((tempArrUpp || tempArrLow) && tempArrNum) {
        score += 2;
    } else if ((tempArrUpp || tempArrLow) && tempArrNum && tempArrSym) {
        score += 3;
    } else if (tempArrUpp && tempArrLow && tempArrNum && tempArrSym) {
        score += 5;
    }
    /*log out score*/
    if (score >= 0 && score < 25) {
        console.log("VER_WEAK");
    } else if (score >= 25 && score < 50) {
        console.log("WEAK");
    } else if (score >= 50 && score < 60) {
        console.log("AVERAGE");
    } else if (score >= 60 && score < 70) {
        console.log("STRONG");
    } else if (score >= 70 && score < 80) {
        console.log("VERY_STRONG");
    } else if (score >= 80 && score < 90) {
        console.log("SECURE");
    } else if (score >= 90) {
        console.log("VERY_SECURE");
    };
};

编辑于 2020-06-13 16:11:57 回复(0)
/**
 * Created by dcp on 2018/7/3.
 */
var readline = require('readline');

rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});


rl.on('line', function(data) {
    var str1=data;
    console.log(getSecurity(str1))



});



//密码长度得分
function lengthAdd(password){
    if(password.length<=4){
        return 5;
    }else if(password.length>=5&&password.length<=7){
        return 10;
    }else {
        return 25;
    }
}

//字母得分
function leterAdd(password) {
    var upperLetter=0;
    var lowerLetter=0;
    for(var i=0;i<password.length;i++){
        var ch=password.charAt(i);
        if(ch.match('[A-Z]')){
            upperLetter++;
        }else if(ch.match('[a-z]')){
            lowerLetter++;
        }
    }
    //如果既有大写字母又有小写字母
    if(upperLetter!==0&&lowerLetter!==0){
        return 20;
    }else if((upperLetter===0&&lowerLetter!==0)||(upperLetter!==0&&lowerLetter===0)){
        return 10;
    }else {
        return 0;
    }

}

//数字得分
function numberAdd(password) {
    var numInterger=0;
    for(var i=0;i<password.length;i++){
        if(password.charAt(i)>='0'&&password.charAt(i)<='9'){
            numInterger++;
        }
    }
    if(numInterger>1){
        return 20;
    }else if(numInterger){
        return 10;
    }else {
        return 0;
    }

}

//符号得分
function symbolAdd(password) {
    var numSymbol=0;
    for(var i=0;i<password.length;i++){
        var ch=password.charAt(i).charCodeAt();
        if((ch>=0x21 && ch<=0x2F) || (ch>=0x3A && ch<=0x40) || (ch>=0x5B && ch<=0x60) || (ch>=0x7B && ch<=0x7E) ){
            numSymbol++;
        }

    }

    if(numSymbol===0){
        return 0;
    }else if(numSymbol===1){
        return 10;

    }else {
        return 25;
    }


}


//奖励得分
function awardAdd(password) {
    var letterNum=leterAdd(password);
    var integerNum=numberAdd(password);
    var symbolNum=symbolAdd(password);
    if(letterNum!==0&&integerNum!==0&&symbolNum==0){
        return 2;
    }else if(letterNum==10&&integerNum!==0&symbolNum!==0){
        return 3;
    }else if(letterNum==20&&integerNum!==0&&symbolNum!==0){
        return 5;
    }else {
        return 0;
    }

}

//计算最后得分
function getSecurity(password) {
    var sum=0;
    sum+=lengthAdd(password);
    sum+=leterAdd(password);
    sum+=numberAdd(password);
    sum+=symbolAdd(password);
    sum+=awardAdd(password);


    if(sum>=90){
        return "VERY_SECURE";
    }else if(sum>=80){
        return 'SECURE'
    }else if(sum>=70){
        return 'VERY_STRONG'
    }else if(sum>=60){
        return 'STRONG'
    }else if(sum>=50){
        return 'AVERAGE'
    }else if(sum>=25){
        return 'WEAK'
    }else return 'VERY_WEAK'


}
编辑于 2018-07-03 16:40:09 回复(0)