package auth import ( "crypto/rand" "crypto/sha256" "encoding/base64" "encoding/hex" ) // refreshSecretBytes — длина секрета refresh-токена (256 бит энтропии). const refreshSecretBytes = 32 // NewRefreshToken — случайный секрет для refresh-токена. // В открытом виде он существует только у клиента: в БД уходит хеш. func NewRefreshToken() (string, error) { buf := make([]byte, refreshSecretBytes) if _, err := rand.Read(buf); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(buf), nil } // HashToken — sha256 в hex. Хранение хеша позволяет искать токен // в БД без раскрытия секрета и не даёт вытащить его при утечке дампа. func HashToken(token string) string { sum := sha256.Sum256([]byte(token)) return hex.EncodeToString(sum[:]) }