Скажем, я хотел бы создать безопасный случайный int между 0 и 27, используя:
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
в пакете "crypto/rand".
Как мне это сделать?
Я действительно не понимаю, как это работает, почему он не возвращает один из встроенных в Go объектов вместо указателя на какой-то большой. Тип типа?
EDIT:
Будет ли это считаться достаточно безопасным для токенов?
func getToken(length int) string {
    token := ""
    codeAlphabet := "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    codeAlphabet += "abcdefghijklmnopqrstuvwxyz"
    codeAlphabet += "0123456789"
    for i := 0; i < length; i++ {
        token += string(codeAlphabet[cryptoRandSecure(int64(len(codeAlphabet)))])
    }
    return token
}
func cryptoRandSecure(max int64) int64 {
    nBig, err := rand.Int(rand.Reader, big.NewInt(max))
    if err != nil {
        log.Println(err)
    }
    return nBig.Int64()
}
func main() {
    fmt.Println(getToken(32))
}
Это приведет к следующему:
qZDbuPwNQGrgVmZCU9A7FUWbp8eIfn0Z
EwZVoQ5D5SEfdhiRsDfH6dU6tAovILCZ
cOqzODVP0GwbiNBwtmqLA78rFgV9d3VT