Скажем, я хотел бы создать безопасный случайный 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