crypto/rand

Guided tour · Crypto · pkg.go.dev →

Cryptographically-secure random bytes. Reach for this for tokens, keys, nonces. NEVER math/rand for security.

Random bytes

Fill a buffer

buf := make([]byte, 32)
_, err := rand.Read(buf)
if err != nil { log.Fatal(err) }
fmt.Printf("%x\n", buf)

Build a session token

b := make([]byte, 32)
rand.Read(b)
token := base64.RawURLEncoding.EncodeToString(b)

Bounded integers

Int — uniform random *big.Int in [0, max)

max := big.NewInt(1_000_000)
n, _ := rand.Int(rand.Reader, max)
fmt.Println(n)

Text (Go 1.24+) — random ASCII token

fmt.Println(rand.Text())   // "Hk8v9Q5xA3qUJ..." (26 chars default)

rand.Reader

An io.Reader you can pass anywhere a random source is asked for — RSA key gen, TLS cert creation, etc.