62 lines
1.7 KiB
Go
62 lines
1.7 KiB
Go
|
package utils
|
||
|
|
||
|
import (
|
||
|
"golang.org/x/crypto/bcrypt"
|
||
|
"unicode/utf8"
|
||
|
)
|
||
|
|
||
|
// Password
|
||
|
// @description: 密码工具包
|
||
|
type Password interface {
|
||
|
CheckPasswordRule(password string) bool // 检查是否合规
|
||
|
HashPassword(password *string) // 加密密码
|
||
|
ComparePassword(dbPass, pass string) bool // 校验密码
|
||
|
}
|
||
|
|
||
|
type password struct{}
|
||
|
|
||
|
// PasswordUtils
|
||
|
// @description: 密码工具包
|
||
|
// @return Password
|
||
|
func PasswordUtils() Password {
|
||
|
return &password{}
|
||
|
}
|
||
|
|
||
|
// CheckPasswordRule
|
||
|
// @description: TODO 检查密码规则是否健全
|
||
|
// @receiver password
|
||
|
// @param password
|
||
|
// @return bool
|
||
|
func (password) CheckPasswordRule(password string) bool {
|
||
|
// 正则判断密码必须包含数字、字母大小写
|
||
|
//reg := regexp.MustCompile(`^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[^]{8,16}$`)
|
||
|
////return regexp.MustCompile(`^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*]).{6,32}$`).MatchString(password)
|
||
|
//matched, err := regexp.MatchString(`^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,32}$`, password)
|
||
|
//if err != nil {
|
||
|
// log.Errorf("正则匹配错误: %v", err.Error())
|
||
|
// return false
|
||
|
//}
|
||
|
//return matched
|
||
|
return utf8.RuneCountInString(password) >= 8 && utf8.RuneCountInString(password) <= 32
|
||
|
}
|
||
|
|
||
|
// HashPassword
|
||
|
// @description: 密码加密
|
||
|
// @receiver password
|
||
|
// @param pass
|
||
|
func (password) HashPassword(pass *string) {
|
||
|
bytePass := []byte(*pass)
|
||
|
hPass, _ := bcrypt.GenerateFromPassword(bytePass, bcrypt.DefaultCost)
|
||
|
*pass = string(hPass)
|
||
|
}
|
||
|
|
||
|
// ComparePassword
|
||
|
// @description: 密码比较
|
||
|
// @receiver password
|
||
|
// @param dbPass
|
||
|
// @param pass
|
||
|
// @return bool
|
||
|
func (password) ComparePassword(dbPass, pass string) bool {
|
||
|
return bcrypt.CompareHashAndPassword([]byte(dbPass), []byte(pass)) == nil
|
||
|
}
|