package mill import ( "crypto/rand" "crypto/sha256" "encoding/base64" "encoding/hex" ) func GenerateToken() (string, error) { var b [32]byte if _, err := rand.Read(b[:]); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(b[:]), nil } // hashes the token for persistence and comparison. a database leak never // exposes a usable token, and lookup avoids a secret-dependent comparison func HashToken(token string) string { sum := sha256.Sum256([]byte(token)) return hex.EncodeToString(sum[:]) }