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