Cara bermain Gembok Hash
- Baca instruksi level. API yang perlu kamu pakai disebut di sana.
- Tulis isi fungsi async
buka(). Variabel tiap loker sudah tersedia, dan fungsimu dijalankan sekali untuk tiap loker. - Hasil
returnkodemu tampil di tiap loker setiap kamu mengetik. Gembok terbuka kalau hasilnya sesuai. - Tekan Cek jawaban atau Ctrl + Enter. Semua gembok harus terbuka, jadi jawaban yang ditulis langsung tidak cukup.
- Kalau buntu, buka Petunjuk. Petunjuk pertama mengarahkan, petunjuk terakhir hampir menjawab.
- Level yang sudah selesai tetap tercentang saat kamu kembali dengan browser yang sama.
Yang kamu pelajari
- Level 1
TextEncoder
Mengubah teks jadi byte UTF-8, bentuk yang dibaca semua fungsi kriptografi.
- Level 2
Hex
Menulis tiap byte sebagai dua digit
00sampaiff, supaya sidik bisa disimpan sebagai teks. - Level 3
Base64 bukan enkripsi
atobmembuka Base64 tanpa kunci. Base64 hanya cara menulis byte, bukan cara menyembunyikannya. - Level 4
crypto.subtle.digest SHA-256
Membuat sidik 32 byte dari data apa pun. Hasilnya Promise berisi
ArrayBuffer. - Level 5
Hash deterministik
Masukan yang sama selalu memberi sidik yang sama, jadi sidik bisa dicocokkan tanpa menyimpan aslinya.
- Level 6
Efek longsor
Beda satu karakter mengubah sekitar separuh dari 256 bit sidik.
- Level 7
Satu arah dan tebak paksa
Sidik tidak bisa dibalik, tapi masukan pendek bisa ditebak dengan mencoba semuanya.
- Level 8
crypto.randomUUID dan getRandomValues
Angka acak yang aman untuk token dan garam, berbeda dengan
Math.random(). - Level 9
Garam
Nilai acak per pengguna yang ditempel ke sandi, supaya sandi yang sama punya sidik berbeda.
- Level 10
HMAC dengan importKey dan sign
Cap dari kunci rahasia dan pesan. Tanpa kunci, cap yang sah tidak bisa dibuat.
- Level 11
crypto.subtle.verify
Memeriksa cap HMAC dan menolak pesan yang diubah atau dicap kunci lain.
SHA-256 bukan tempat menyimpan sandi
SHA-256 sengaja dibuat cepat. Itu bagus untuk sidik file dan HMAC, tapi buruk untuk sandi: di level 7 kamu menebak 1000 PIN dalam sekejap, dan kartu grafis bisa mencoba miliaran sandi per detik. Garam mencegah satu tebakan membuka banyak akun sekaligus, tapi tidak membuat tiap tebakan lebih lambat.
Untuk sandi sungguhan, hash di server dengan algoritma yang sengaja lambat dan bergaram seperti Argon2id, bcrypt, atau PBKDF2 dengan iterasi tinggi, lewat library yang sudah teruji. Jangan pernah menyimpan sandi polos, dan jangan menganggap Base64 sebagai penyamaran.
Tanya jawab
Apakah harus daftar akun untuk bermain?
Tidak. Semua level bisa dimainkan tanpa akun. Kemajuanmu disimpan di browser yang kamu pakai, jadi akan hilang kalau data browser dihapus.
Di mana kodeku dijalankan?
Di Web Worker di dalam iframe terpisah, bukan di halaman ini. Kodemu tidak bisa membaca cookie atau data Mahir, dan perulangan yang tidak berhenti dihentikan setelah beberapa detik.
Apa beda hash, enkripsi, dan Base64?
Hash satu arah: sidik tidak bisa dikembalikan jadi data aslinya. Enkripsi dua arah: data bisa dibuka lagi, tapi hanya dengan kunci. Base64 bukan keduanya, hanya cara menulis byte dengan huruf yang bisa dibuka siapa pun.
Kenapa crypto.subtle tidak ada di halamanku?
crypto.subtle hanya tersedia di secure context: halaman HTTPS atau localhost. Di halaman HTTP biasa nilainya undefined.
Bolehkah meng-hash sandi di browser sebelum dikirim ke server?
Itu tidak menggantikan hash di server. Sidik yang dikirim browser berfungsi sebagai sandi baru, jadi kalau database bocor, sidik itu bisa langsung dipakai masuk. Kirim sandi lewat HTTPS dan hash di server dengan Argon2id, bcrypt, atau PBKDF2.
Kenapa HMAC, bukan sha256(kunci + pesan)?
Menempel kunci lalu meng-hash rentan serangan length extension pada SHA-256: penyerang bisa menambah teks ke pesan dan membuat sidik baru yang tetap cocok tanpa tahu kuncinya. HMAC dirancang untuk menutup celah itu, dan crypto.subtle.verify membandingkan cap dalam waktu tetap.