diff --git a/tracer/util.go b/tracer/util.go index 06490ed5..a72f9c05 100644 --- a/tracer/util.go +++ b/tracer/util.go @@ -1,17 +1,31 @@ package tracer import ( + cryptorand "crypto/rand" + "encoding/binary" "math/rand" "sync" "time" ) var ( - seededIDGen = rand.New(rand.NewSource(time.Now().UnixNano())) + seededIDGen = rand.New(rand.NewSource(generateSeed())) // The golang rand generators are *not* intrinsically thread-safe. seededIDLock sync.Mutex ) +func generateSeed() int64 { + var b [8]byte + _, err := cryptorand.Read(b[:]) + if err != nil { + // Cannot seed math/rand package with cryptographically secure random number generator + // Fallback to time.Now() + return time.Now().UnixNano() + } + + return int64(binary.LittleEndian.Uint64(b[:])) +} + func randomID() uint64 { seededIDLock.Lock() defer seededIDLock.Unlock()