package crypt import ( "crypto/rand" "encoding/base64" "fmt" "math/big" ) func Nonce() (string, error) { b := make([]byte, 16) if _, err := rand.Read(b); err != nil { return "", err } return base64.RawURLEncoding.EncodeToString(b), nil } func VerificationCode() (string, error) { max := big.NewInt(1000000) n, err := rand.Int(rand.Reader, max) if err != nil { return "", err } return fmt.Sprintf("%06d", n.Int64()), nil } const charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" func RID(length int) (string, error) { return RandomString(charset, length) } // RandomString draws length characters uniformly from alphabet. func RandomString(alphabet string, length int) (string, error) { max := big.NewInt(int64(len(alphabet))) b := make([]byte, length) for i := range b { n, err := rand.Int(rand.Reader, max) if err != nil { return "", err } b[i] = alphabet[n.Int64()] } return string(b), nil }