【简单】算法nodeJs:密码强度等级

92 阅读2分钟

描述

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

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

输出描述:

输出密码等级

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
    line = await readline();
    const pLength = (s) => {
        if (s.length <= 4) return 5;
        else if (s.length >= 5 && s.length <= 7) return 10;
        else return 25;
    };
    const az = (s) => {
        const upCode = s.match(/[A-Z]/g)?.length;
        const downCode = s.match(/[a-z]/g)?.length;
        if (upCode && downCode) return 20;
        else if (upCode || downCode) return 10;
        else return 0;
    };
    const num = (s) => {
        const num = s.match(/[0-9]/g)?.length;
        if (num > 1) return 20;
        else if (num == 1) return 10;
        else return 0;
    };
    const sym = (s) => {
        const sym = s.match(/[\W_]/g)?.length;
        if (sym > 1) return 25;
        else if (sym == 1) return 10;
        else return 0;
    };
    const award = (s) => {
        const sym = s.match(/[\W_]/g)?.length;
        const num = s.match(/[0-9]/g)?.length;
        const upCode = s.match(/[A-Z]/g)?.length;
        const downCode = s.match(/[a-z]/g)?.length;
        if (upCode && downCode && num && sym) return 5;
        else if ((upCode || downCode) && num && sym) return 3;
        else if ((upCode || downCode) && num) return 2;
        else return 0
    };
    let Score = pLength(line)  + az(line) + num(line) + sym(line) + award(line);
    // console.log(pLength(line))
    // console.log(az(line))
    // console.log(num(line))
    // console.log(sym(line))
    // console.log(award(line))
    
    switch (true) {
        case Score >= 90:
            console.log("VERY_SECURE");
            break;
        case Score >= 80:
            console.log("SECURE");
            break;
        case Score >= 70:
            console.log("VERY_STRONG");
            break;
        case Score >= 60:
            console.log("STRONG");
            break;
        case Score >= 50:
            console.log("AVERAGE");
            break;
        case Score >= 25:
            console.log("WEAK");
            break;
        default:
            console.log("VERY_WEAK");
    }
})();