Materi
Perbedaan hash dan enkripsi sudah dibahas di kelas Keamanan Siber untuk Organisasi; di sini yang ditulis adalah kodenya. OWASP menyebut tiga syarat: kata sandi tidak pernah disimpan sebagai teks polos atau terenkripsi, hash-nya memakai algoritma yang sengaja lambat seperti Argon2id, bcrypt, atau PBKDF2, dan setiap kata sandi diberi garam unik. SHA-256 biasa terlalu cepat: penyerang yang mencuri tabel bisa mencoba miliaran tebakan. NIST SP 800-63B mewajibkan garam minimal 32 bit dan meminta garam serta hash disimpan untuk setiap kata sandi, beserta parameter biayanya supaya bisa dinaikkan kelak.
Pustaka standar Python menyediakan hashlib.pbkdf2_hmac("sha256", sandi, garam, putaran). Garam dibuat dengan secrets.token_bytes(16), dan rekaman yang disimpan berisi garam, putaran, dan hash. Saat masuk, hash dihitung ulang dengan garam dan putaran dari rekaman itu, lalu dibandingkan dengan hmac.compare_digest. Jumlah putaran untuk produksi diambil dari panduan OWASP terbaru, karena angkanya naik seiring perangkat keras; latihan memakai 1.000 putaran supaya cepat.
import hashlib, hmac, secrets
garam = secrets.token_bytes(16)
kunci = hashlib.pbkdf2_hmac("sha256", "Bakso-Malang-2026".encode(), garam, 1000)
rekaman = {"garam": garam, "putaran": 1000, "hash": kunci}
coba = hashlib.pbkdf2_hmac("sha256", "bakso-malang-2026".encode(), rekaman["garam"], rekaman["putaran"])
print(hmac.compare_digest(coba, rekaman["hash"])) # False