OTP generated with insecure math/rand
Bug Description
In internal/utils/generate_otp.go, OTPs are generated using math/rand seeded with time.Now().UnixNano(). This is not cryptographically secure and the seed is re-initialized on every call, meaning concurrent calls at the same nanosecond produce identical OTPs.
Impact
HIGH — OTPs are predictable. An attacker who knows the approximate time of OTP generation can guess the OTP.
Fix
Replace math/rand with crypto/rand for cryptographically secure OTP generation.