Пакет math/rand реализует псевдослучайный генератор (PRNG). Он не использует криптографически стойкий источник энтропии и полностью детерминирован: при одном и том же начальном значении (seed) выдает одну и ту же последовательность чисел.
Для токенов, паролей, ключей сессий и любых криптографических целей это недопустимо: злоумышленник может предсказать или перебрать значения.
Правильный выбор - пакет crypto/rand, который читает энтропию из ОС (например, /dev/urandom) и дает криптографически стойкие случайные байты.
import "crypto/rand"
token := make([]byte, 32)
if _, err := rand.Read(token); err != nil {
// обработка ошибки
}
// token - криптографически стойкийИспользование math/rand для безопасности - типичная ошибка, которая может привести к подбору токенов и компрометации сессий.