package auth import ( "crypto/rand" "crypto/sha256" "encoding/base64" "encoding/hex" ) // NewOpaqueToken returns a 32-byte URL-safe random token plus its SHA-256 hex // digest. The raw value is shown once (in a link); only the digest is stored. func NewOpaqueToken() (raw, hash string, err error) { buf := make([]byte, 32) if _, err := rand.Read(buf); err != nil { return "", "", err } raw = base64.RawURLEncoding.EncodeToString(buf) sum := sha256.Sum256([]byte(raw)) hash = hex.EncodeToString(sum[:]) return raw, hash, nil } func HashOpaque(raw string) string { sum := sha256.Sum256([]byte(raw)) return hex.EncodeToString(sum[:]) }