Crypto-Secure Random Tokens
Generate URL-safe tokens from crypto/rand with an entropy floor, plus unbiased numeric codes using crypto/rand.Int.
Code
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
"math/big"
)
func RandomToken(size int) (string, error) {
if size < 16 {
return "", fmt.Errorf("token entropy too low: %d bytes", size)
}
buffer := make([]byte, size)
if _, err := rand.Read(buffer); err != nil {
return "", err
}
return base64.RawURLEncoding.EncodeToString(buffer), nil
}
func RandomDigits(length int) (string, error) {
if length < 1 {
return "", fmt.Errorf("length must be positive: %d", length)
}
limit := big.NewInt(10)
out := make([]byte, length)
for index := range out {
digit, err := rand.Int(rand.Reader, limit)
if err != nil {
return "", err
}
out[index] = byte('0' + digit.Int64())
}
return string(out), nil
}
func main() {
token, tokenErr := RandomToken(24)
fmt.Println(token, tokenErr)
code, codeErr := RandomDigits(6)
fmt.Println(code, codeErr)
}
Report a problem with this exampleOpens a pre-filled issue on GitHub.