Pengenalan Modul Secrets
Modul secrets diperkenalkan pada Python 3.6 melalui PEP 506 untuk menyediakan cara yang aman secara kriptografis dalam menghasilkan angka acak. Berbeda dengan modul random yang bersifat deterministik dan ditujukan untuk simulasi atau pemodelan, secrets dirancang khusus untuk mengelola data sensitif seperti password, token autentikasi, dan kunci enkripsi.
Fungsi Utama Modul Secrets
Modul ini memanfaatkan sumber entropi terbaik yang disediakan oleh sistem operasi (seperti /dev/urandom pada sistem Unix atau CryptGenRandom pada Windows). Berikut adalah fungsi-fungsi esensial yang wajib dipahami:
| Fungsi | Kegunaan |
|---|---|
| secrets.token_bytes(nbytes) | Menghasilkan string byte acak sepanjang nbytes. |
| secrets.token_hex(nbytes) | Menghasilkan string heksadesimal acak. |
| secrets.token_urlsafe(nbytes) | Menghasilkan string acak yang aman untuk URL. |
| secrets.choice(seq) | Memilih elemen acak dari urutan (aman secara kriptografis). |
| secrets.compare_digest(a, b) | Membandingkan dua string untuk mencegah serangan timing. |
Implementasi Kode
Berikut adalah contoh implementasi praktis untuk menghasilkan token keamanan dan membandingkan digest untuk autentikasi:
import secrets
# 1. Membuat token untuk reset password (URL safe)
token = secrets.token_urlsafe(32)
print(f"Token Keamanan: {token}")
# 2. Membuat password sementara
pwd = ''.join([secrets.choice('abcdefghijklmnopqrstuvwxyz0123456789') for i in range(12)])
print(f"Password Sementara: {pwd}")
# 3. Perbandingan aman (mencegah timing attack)
user_input = "input_pengguna"
stored_hash = "hash_database"
if secrets.compare_digest(user_input, stored_hash):
print("Autentikasi Berhasil")
else:
print("Autentikasi Gagal")Mengapa Tidak Menggunakan Modul Random?
Modul random menggunakan algoritma Mersenne Twister yang dapat diprediksi jika penyerang mengetahui urutan angka acak sebelumnya. Dalam konteks keamanan, prediksi ini memungkinkan penyerang menebak token atau kunci yang dihasilkan. secrets menjamin bahwa output yang dihasilkan memiliki entropi tinggi dan tidak dapat diprediksi, menjadikannya standar industri untuk aplikasi Python modern.
Tips Keamanan
- Gunakan
secrets.token_urlsafe()untuk token yang akan dikirim melalui email atau URL. - Selalu gunakan
secrets.compare_digest()saat memverifikasi hash password atau token API untuk menghindari serangan timing attack yang mengukur waktu respon server. - Jangan pernah menggunakan
random.random()ataurandom.choice()untuk keperluan otorisasi atau enkripsi.