一个计算密码强度的算法题目(javascript语法)

93 阅读2分钟

题目描述

1、题目介绍 密码强度按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

(1)、密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符

(2)、字母: 0 分: 没有字母 10 分: 包含的字母全都是小(大)写字母 20 分: 包含的字母为大小写混合字母

(3)、数字: 0 分: 没有数字 10 分: 1 个数字 20 分: 大于1 个数字

(4)、特殊符号: 0 分: 没有特殊符号 10 分: 1 个特殊符号 25 分: 大于1 个特殊符号

(5)、奖励(只能获取最高分值奖励,不可叠加获取): 2 分: 字母和数字 5 分: 字母、数字和符号 10 分: 大小写字母、数字和符号 最后的评分标准:

       >= 90: 非常安全(Very Secure)
       >= 80: 安全(Secure)
       >= 70: 非常强(Very Strong)
       >= 60: 强(Strong)
       >= 50: 一般(Average)
       >= 25: 弱(Weak)
       >= 0:  非常弱(Very Weak)

注:

字母:a-z, A-Z

数字:0-9

特殊符号包含如下:

!"#$%&'()*+,-./ (ASCII码:0x21~0x2F)
 :;<=>?@ (ASCII码:0x3A~0x40) 
[\]^_` (ASCII码:0x5B~0x60)
 {|}~ (ASCII码:0x7B~0x7E)

2、编程实现

(1)、实现如下的函数。输入是一个字符串,表示一个密码。输出是密码强度。如,最后得到分值85,则输出“Secure”。注意,不用做异常校验,

getPwdSecurityLevel(String password)
{
}

(2)、函数参数描述:

  1. password:一个字符串,表示一个密码。
  2. 密码无空白字符。
  3. 字母区分大小写。

(3)、返回值要求: 密码强度表示的字符串。

>= 90返回Very Secure   
>= 80返回Secure
>= 70返回Very Strong
>= 60返回Strong
>= 50返回Average
>= 25返回Weak
>= 0返回Very Weak

解题代码

function getPwdSecurityLevel(password) {
  if (typeof password !== 'string') {
    return 0
  }
  let hasUpperCase, hasLowerCase, hasNumbers, hasSpecialCharacters
  let score = 0
  if (password.length < 4) {
    score = 5
  } else if (password.length < 8) {
    score = 10
  } else {
    score = 25
  }

  // (2)
  // 使用match 方法判断password是否只包含大写,或者是否只包含小写
  // 如果是则score加10
  if (password.match(/[A-Z]/)) {
    score += 10
    hasUpperCase = true
  }
  if (password.match(/[a-z]/)) {
    score += 10
    hasLowerCase = true
  }

  // (3)
  let numMatch = password.match(/\d/g)
  if (numMatch) {
    if (password.match(/\d/g).length > 1) {
      score += 20
    } else {
      score += 10
    }
    hasNumbers = true
  }

  /**
   *  (4)  解法 1:
   *  定义一个特殊字符字符串变量str,值为!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
   *  遍历password每个字符it,判断str是否包含it,把包含的次数记录在count变量中
   *  遍历结束后,如果count 的值为1则score+10,count的值大于1则score+25
   */
  // let str = "!#$%&'()*+,-./:;<=>?@[]^_`{|}~"
  // let count = 0
  // for (let i = 0; i < password.length; i++) {
  //   if (str.includes(password[i])) {
  //     count++
  //   }
  // }
  // if (count === 1) {
  //   score += 10
  // } else if (count > 1) {
  //   score += 25
  // }

  /**
   *  (4)  解法 2:
   *  变量password为字符串,使用match方法及全局正则表达式判断字符串password是否包含!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
   *  如果匹配个数为1则score+10,如果匹配个数为大于1则score+25
   */
  const regex = /["#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/g
  const matches = password.match(regex)
  if (matches) {
    if (matches.length === 1) {
      score += 10
    } else if (matches.length > 1) {
      score += 25
    }
    hasSpecialCharacters = true
  }

  // (5)、奖励(只能获取最高分值奖励,不可叠加获取):
  if (hasUpperCase && hasLowerCase && hasNumbers && hasSpecialCharacters) {
    score += 10
  } else if (
    hasSpecialCharacters &&
    hasNumbers &&
    (hasUpperCase || hasLowerCase)
  ) {
    score += 5
  } else if (hasNumbers && (hasUpperCase || hasLowerCase)) {
    score += 2
  }

  // return convert(score)
  return score
}

function convert(score) {
  if (score >= 90) {
    return 'Very Secure'
  } else if (score >= 80) {
    return 'Very Secure'
  } else if (score >= 70) {
    return 'Very Strong'
  } else if (score >= 60) {
    return 'Strong'
  } else if (score >= 50) {
    return 'Average'
  } else if (score >= 25) {
    return 'Weak'
  } else {
    return 'Very Weak'
  }
}

let res = getPwdSecurityLevel('Snake230303..##@')

console.log(res)