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 }