63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
|
|
package auth
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
|
||
|
|
"golang.org/x/crypto/bcrypt"
|
||
|
|
)
|
||
|
|
|
||
|
|
// HashPassword skapar en bcrypt hash av lösenordet
|
||
|
|
func HashPassword(password string) (string, error) {
|
||
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||
|
|
if err != nil {
|
||
|
|
return "", fmt.Errorf("failed to hash password: %w", err)
|
||
|
|
}
|
||
|
|
return string(bytes), nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// VerifyPassword kontrollerar att lösenordet matchar hashen
|
||
|
|
func VerifyPassword(password, hash string) bool {
|
||
|
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
||
|
|
return err == nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// ValidatePasswordStrength kontrollerar lösenordsstyrka
|
||
|
|
func ValidatePasswordStrength(password string) error {
|
||
|
|
if len(password) < 8 {
|
||
|
|
return fmt.Errorf("password must be at least 8 characters")
|
||
|
|
}
|
||
|
|
|
||
|
|
hasUpper := false
|
||
|
|
hasLower := false
|
||
|
|
hasNumber := false
|
||
|
|
hasSpecial := false
|
||
|
|
|
||
|
|
for _, c := range password {
|
||
|
|
switch {
|
||
|
|
case c >= 'A' && c <= 'Z':
|
||
|
|
hasUpper = true
|
||
|
|
case c >= 'a' && c <= 'z':
|
||
|
|
hasLower = true
|
||
|
|
case c >= '0' && c <= '9':
|
||
|
|
hasNumber = true
|
||
|
|
case c >= '!' && c <= '/' || c >= ':' && c <= '@' || c >= '[' && c <= '`' || c >= '{' && c <= '~':
|
||
|
|
hasSpecial = true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if !hasUpper {
|
||
|
|
return fmt.Errorf("password must contain at least one uppercase letter")
|
||
|
|
}
|
||
|
|
if !hasLower {
|
||
|
|
return fmt.Errorf("password must contain at least one lowercase letter")
|
||
|
|
}
|
||
|
|
if !hasNumber {
|
||
|
|
return fmt.Errorf("password must contain at least one number")
|
||
|
|
}
|
||
|
|
if !hasSpecial {
|
||
|
|
return fmt.Errorf("password must contain at least one special character")
|
||
|
|
}
|
||
|
|
|
||
|
|
return nil
|
||
|
|
}
|