Use of cryptographically weak Pseudo-Random Number Generator (PRNG)
- Rule ID: go_gosec_crypto_weak_random
- Languages: go
- Source: weak_random.yml
Description
The math/rand
package in Go is designed for generating pseudorandom numbers, which are not secure for cryptographic purposes. These numbers are predictable if the seed is known, which could compromise the security of applications using them for secrets, tokens, or other security-sensitive features.
Remediations
To securely generate random numbers in a security-sensitive context, implement the following measures:
✅ Use Cryptographically Secure Randomness
Replace the use of math/rand
with crypto/rand
to ensure that the random numbers generated are suitable for cryptographic use and are not predictable.
import (
"crypto/rand"
"log"
"math/big"
)
func generateSecureRandomNumber() *big.Int {
// Generate a cryptographically secure random number
randomNumber, err := rand.Int(rand.Reader, big.NewInt(1<<62))
if err != nil {
log.Fatalf("Failed to generate a secure random number: %v", err)
}
return randomNumber
}
✅ Audit Existing Code
Review your codebase for instances where math/rand
is used in security-sensitive contexts and update them to use crypto/rand
.
❌ Do Not Use Predictable Seeds
Avoid initializing math/rand
with predictable seeds, such as timestamps or other easily guessable values, especially in a security context.
❌ Don't Use for Security Purposes
Never rely on math/rand
for generating random numbers in cryptographic applications, like key generation, authentication tokens, or any form of security challenge.
Resources
Associated CWE
OWASP Top 10
Configuration
To skip this rule during a scan, use the following flag
bearer scan /path/to/your-project/ --skip-rule=go_gosec_crypto_weak_random
To run only this rule during a scan, use the following flag
bearer scan /path/to/your-project/ --only-rule=go_gosec_crypto_weak_random
Ready to take the next step? Learn more about Bearer Cloud.