1package backend23import (4 "crypto/rand"5 "crypto/sha256"6 "encoding/hex"78 "github.com/charmbracelet/log/v2"9 "golang.org/x/crypto/bcrypt"10)1112const saltySalt = "salty-soft-serve"1314// HashPassword hashes the password using bcrypt.15func HashPassword(password string) (string, error) {16 crypt, err := bcrypt.GenerateFromPassword([]byte(password+saltySalt), bcrypt.DefaultCost)17 if err != nil {18 return "", err19 }2021 return string(crypt), nil22}2324// VerifyPassword verifies the password against the hash.25func VerifyPassword(password, hash string) bool {26 err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password+saltySalt))27 return err == nil28}2930// GenerateToken returns a random unique token.31func GenerateToken() string {32 buf := make([]byte, 20)33 if _, err := rand.Read(buf); err != nil {34 log.Error("unable to generate access token")35 return ""36 }3738 return "ss_" + hex.EncodeToString(buf)39}4041// HashToken hashes the token using sha256.42func HashToken(token string) string {43 sum := sha256.Sum256([]byte(token + saltySalt))44 return hex.EncodeToString(sum[:])45}