42 lines
972 B
Go
42 lines
972 B
Go
package auth
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"unicode"
|
|
"unicode/utf8"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
func validatePassword(value string) error {
|
|
if utf8.RuneCountInString(value) < 12 {
|
|
return errors.New("密码至少需要 12 个字符")
|
|
}
|
|
var lower, upper, digit bool
|
|
for _, r := range value {
|
|
lower = lower || unicode.IsLower(r)
|
|
upper = upper || unicode.IsUpper(r)
|
|
digit = digit || unicode.IsDigit(r)
|
|
}
|
|
if !lower || !upper || !digit {
|
|
return errors.New("密码必须同时包含大写字母、小写字母和数字")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func hashPassword(value string) (string, error) {
|
|
if err := validatePassword(value); err != nil {
|
|
return "", err
|
|
}
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(value), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return "", fmt.Errorf("hash password: %w", err)
|
|
}
|
|
return string(hash), nil
|
|
}
|
|
|
|
func passwordMatches(hash, value string) bool {
|
|
return bcrypt.CompareHashAndPassword([]byte(hash), []byte(value)) == nil
|
|
}
|