diff --git a/MIND/SUMMARY/8-Jun-26/fix-otp-csprng-summary.md b/MIND/SUMMARY/8-Jun-26/fix-otp-csprng-summary.md new file mode 100644 index 00000000..c47bcb30 --- /dev/null +++ b/MIND/SUMMARY/8-Jun-26/fix-otp-csprng-summary.md @@ -0,0 +1,50 @@ +# Summary: Fix OTP — Ganti Math.random() dengan CSPRNG + +**Tanggal**: 2026-06-08 +**Branch**: tasks/auth/fix-otp-csprng/20260608 + +--- + +## Apa yang Diubah + +**File**: `src/app/api/auth/_lib/randomOTP.ts` + +### Sebelum +```ts +export function randomOTP() { + const random = Math.floor(Math.random() * (9000 - 1000)) + 1000 + return random; +} +``` + +### Sesudah +```ts +import { randomInt } from "crypto"; + +export function randomOTP() { + return randomInt(1000, 10000); +} +``` + +--- + +## Mengapa Diubah + +`Math.random()` adalah PRNG (Pseudorandom Number Generator) yang **tidak kriptografis aman**. Output-nya dapat diprediksi jika penyerang mengetahui seed atau pola output sebelumnya. OTP yang dapat diprediksi membuka celah serangan brute-force yang terarah atau bahkan prediksi langsung. + +`crypto.randomInt` dari Node.js built-in `crypto` module menggunakan CSPRNG (Cryptographically Secure Pseudorandom Number Generator) yang sesuai standar keamanan untuk keperluan otentikasi. + +--- + +## Dampak + +- Tidak ada perubahan antarmuka/kontrak fungsi — return type tetap `number`, range tetap 4 digit (1000–9999). +- Tidak ada breaking change pada konsumen `randomOTP()`. +- Peningkatan keamanan pada alur OTP login pengguna. + +--- + +## Referensi + +- Node.js docs: [`crypto.randomInt(min, max)`](https://nodejs.org/api/crypto.html#cryptorandomintmin-max-callback) +- OWASP: [Insecure Randomness](https://owasp.org/www-community/vulnerabilities/Insecure_Randomness) diff --git a/src/app/api/auth/_lib/randomOTP.ts b/src/app/api/auth/_lib/randomOTP.ts index 6f6d2447..ae9e3193 100644 --- a/src/app/api/auth/_lib/randomOTP.ts +++ b/src/app/api/auth/_lib/randomOTP.ts @@ -1,4 +1,5 @@ +import { randomInt } from "crypto"; + export function randomOTP() { - const random = Math.floor(Math.random() * (9000 - 1000 )) + 1000 - return random; + return randomInt(1000, 10000); } \ No newline at end of file