Go 檢測密碼強度(密碼安全性)

目錄

密碼強度

解決方案

代碼

代碼走讀


 

密碼強度

在涉及修改密碼的場景中,密碼強度(也稱密碼安全性)校驗是繞不開的話題。一個密碼的安全性除了與密碼長度相關外,也與密碼所採用的字符種類有關。在不考慮密碼長度的情況下,密碼強度通常分爲以下五類(由高到低排序):

密碼強度 說明 示例
S 密碼中必須存在特殊字符、大小寫字母和數字 Csdn#2020
A

對特殊字符、大寫字母、小寫字母和數字至少存在3種

csdn#2020
B 對特殊字符、大寫字母、小寫字母和數字至少存在2種 csdn2020
C 對特殊字符、大寫字母、小寫字母和數字至少存在1種 csdn
D 不存在特殊字符、大小寫字母和數字。 /、\

💡提示:特殊字符集假定爲  ~!@#$%^&*?_-

 

解決方案

檢測密碼強度包含兩個方面,一個是密碼長度,另一個是包含的字符種類。對不符合長度要求的密碼和字符種類範圍低的密碼報錯返回。

 

代碼

package check_pwd

import (
	"fmt"
	"regexp"
)

const (
	levelD = iota
	LevelC
	LevelB
	LevelA
	LevelS
)

func Check(minLength, maxLength, minLevel int, pwd string) error {
	if len(pwd) < minLength {
		return fmt.Errorf("BAD PASSWORD: The password is shorter than %d characters", minLength)
	}
	if len(pwd) > maxLength {
		return fmt.Errorf("BAD PASSWORD: The password is logner than %d characters", maxLength)
	}

	var level int = levelD
	patternList := []string{`[0-9]+`, `[a-z]+`, `[A-Z]+`, `[~!@#$%^&*?_-]+`}
	for _, pattern := range patternList {
		match, _ := regexp.MatchString(pattern, pwd)
		if match {
			level++
		}
	}

	if level < minLevel {
		return fmt.Errorf("The password does not satisfy the current policy requirements. ")
	}
	return nil
}

 

代碼走讀

package check_pwd

import (
   "fmt"
   "regexp"
)

// 密碼強度等級,D爲最低
const (
   levelD = iota
   LevelC
   LevelB
   LevelA
   LevelS
)

/*
 *  minLength: 指定密碼的最小長度
 *  maxLength:指定密碼的最大長度
 *  minLevel:指定密碼最低要求的強度等級
 *  pwd:明文密碼
 */
func Check(minLength, maxLength, minLevel int, pwd string) error {
   // 首先校驗密碼長度是否在範圍內
   if len(pwd) < minLength {
      return fmt.Errorf("BAD PASSWORD: The password is shorter than %d characters", minLength)
   }
   if len(pwd) > maxLength {
      return fmt.Errorf("BAD PASSWORD: The password is logner than %d characters", maxLength)
   }

   // 初始化密碼強度等級爲D,利用正則校驗密碼強度,若匹配成功則強度自增1
   var level int = levelD
   patternList := []string{`[0-9]+`, `[a-z]+`, `[A-Z]+`, `[~!@#$%^&*?_-]+`}
   for _, pattern := range patternList {
      match, _ := regexp.MatchString(pattern, pwd)
      if match {
         level++
      }
   }

   // 如果最終密碼強度低於要求的最低強度,返回並報錯
   if level < minLevel {
      return fmt.Errorf("The password does not satisfy the current policy requirements. ")
   }
   return nil
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章