Crypto-Secure Random Tokens

Generate URL-safe tokens from crypto/rand with an entropy floor, plus unbiased numeric codes using crypto/rand.Int.

GoSecurity Boundaries

Code

snippet
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)
}