Soal 1Modul mana yang harus kamu jangkau untuk membuat token reset password?
random dan secrets — Memilih Jenis Angka Acak yang Tepat
Pelajari modul random dan secrets Python dari dasar. Mencakup sekuens pseudo-random yang bisa direproduksi dengan random.choice / randint / shuffle / sample plus seed, token aman secara kriptografi dengan secrets.token_hex / token_urlsafe, dan kapan pakai yang mana — dengan latihan praktik yang bisa dijalankan.
Artikel ini membahas dua modul angka acak di standard library. random menyediakan nilai pseudo-random untuk testing, game, dan simulasi (bisa direproduksi dengan seed), dan secrets menyediakan nilai tak terduga untuk password, token reset, dan API key (diambil dari sumber acak kriptografis OS). Memilih yang tepat untuk pekerjaan adalah inti sisa artikel ini.
Bagaimana random dan secrets Berbeda
Kedua modul mengembalikan angka acak, tetapi mekanisme dan kasus penggunaannya benar-benar berbeda. random dibangun di atas Mersenne Twister (generator pseudo-random yang banyak digunakan), dan memanggil random.seed(nilai) memungkinkanmu mereproduksi sekuens yang sama. secrets, di sisi lain, mengambil dari sumber acak kriptografis OS (seperti /dev/urandom), jadi tidak ada konsep `seed` dan nilainya tak terduga setiap kali.
Untuk kasus seperti testing atau game — "tidak masalah kalau hasilnya bocor" — gunakan random. Untuk password, token, dan ID sesi — "kalau ada yang bisa memprediksi nilainya, kamu punya insiden keamanan" — gunakan secrets.
| Aspek | random | secrets |
|---|---|---|
| Sumber | Mersenne Twister (algoritma) | Sumber kripto OS (/dev/urandom, dll.) |
| Reproduksibilitas | Sekuens sama bisa direproduksi dengan seed | Tidak bisa direproduksi (selalu beda) |
| Kecepatan | Cepat | Lebih lambat (bukan masalah untuk penggunaan tipikal) |
| Paling cocok untuk | Testing, game, simulasi | Token, password, ID sesi |
random — Dasar (randint / uniform / choice)
Dasar random adalah tiga hal: integer acak / float acak / memilih satu elemen dari list. random.randint(min, max) mengembalikan integer termasuk kedua ujung, random.uniform(min, max) mengembalikan float dalam rentang yang diberikan, dan random.choice(list) mengembalikan satu elemen dari list.
Mari mulai tanpa seed dan lihat bagaimana fungsi-fungsi dasar ini berperilaku.
| Fungsi | Mengembalikan | Penggunaan tipikal |
|---|---|---|
| random.randint(a, b) | Integer di [a, b] (kedua ujung termasuk) | Lemparan dadu, ID test |
| random.uniform(a, b) | Float di [a, b] | Noise, simulasi probabilistik |
| random.choice(seq) | Satu elemen dari sequence | Pilih satu item dari menu |
random — Reproduksibilitas via Seed dan Operasi Koleksi
Sekarang mari lihat reproduksibilitas test dengan `random.seed` dan fungsi operasi koleksi (shuffle / sample). Setelah memanggil random.seed(N), seed yang sama selalu menghasilkan sekuens yang sama. random.shuffle(list) mengacak elemen list di tempat, dan random.sample(list, k) mengembalikan list baru berisi k elemen unik yang diambil darinya.
| Fungsi | Mengembalikan | Penggunaan tipikal |
|---|---|---|
| random.seed(value) | None (menginisialisasi state internal) | Test yang bisa direproduksi |
| random.shuffle(seq) | None (mengacak list asli) | Mengacak urutan list |
| random.sample(seq, k) | List baru berisi k elemen unik | Memilih k responden dari survei |
secrets — Acak Kuat untuk Keamanan
Modul random dari bagian sebelumnya adalah generator pseudo-random untuk testing — kalau state internalnya bocor, nilai berikutnya bisa diprediksi. Untuk hal seperti token reset password, API key, dan ID sesi — "kalau penyerang bisa memprediksi nilainya, kamu punya kerentanan" — pilih modul `secrets`, yang menggunakan sumber acak kriptografis OS.
secrets punya API yang jauh lebih kecil dari random — kebanyakan adalah helper yang mengubah byte acak menjadi string hex atau string aman URL.
| Fungsi | Mengembalikan | Penggunaan tipikal |
|---|---|---|
| secrets.token_bytes(n) | n byte acak | Kunci kripto, token biner internal |
| secrets.token_hex(n) | String hex panjang 2*n | ID sesi login |
| secrets.token_urlsafe(n) | String aman URL (gaya Base64) | Disisipkan di URL link reset |
| secrets.choice(seq) | Satu elemen dari seq, secara kriptografis | Saat urutan tampilan tidak boleh ditebak |
| secrets.compare_digest(a, b) | True / False (tahan timing attack) | Perbandingan hash / token (gunakan ganti ==) |
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Setelah memanggil random.seed(42) lalu random.randint(1, 100), apa yang terjadi kalau kamu lakukan hal yang sama lagi?
Soal 3Pilihan terbaik saat kamu ingin list yang diacak bisa direproduksi untuk testing?