Browser modern memiliki kemampuan kriptografi bawaan yang dapat membantu pengembang membuat hash, menghasilkan nilai acak yang kuat, serta menjalankan operasi tanda tangan dan enkripsi tanpa menambahkan pustaka pihak ketiga untuk setiap kebutuhan. Fitur ini dikenal sebagai Web Crypto API. Meski praktis, API tersebut menyediakan komponen dasar, bukan rancangan keamanan lengkap. Kesalahan memilih algoritma, mengelola kunci, atau menentukan tempat penyimpanan rahasia tetap dapat membuat aplikasi rentan. Untuk memahami fondasi kriptografi browser, lihat panduan TLS Delegated Credentials dan dokumentasi Web Crypto API di MDN.
Apa Itu Web Crypto API?
Web Crypto API diakses melalui objek global crypto. Properti crypto.subtle menyediakan operasi seperti hashing, enkripsi, dekripsi, penandatanganan, verifikasi, serta pembuatan atau impor kunci. Sementara itu, crypto.getRandomValues() menghasilkan data acak yang sesuai untuk kebutuhan keamanan, dan crypto.randomUUID() dapat membuat UUID versi 4.
API ini tersedia di browser modern dan Web Worker. Sebagian besar operasi kriptografi tingkat lanjut memerlukan konteks aman, umumnya halaman HTTPS. Untuk detail dukungan dan batasan, lihat dokumentasi Crypto di MDN serta referensi SubtleCrypto.
Membuat Hash SHA-256 dari Teks
Hash mengubah data menjadi ringkasan berukuran tetap. SHA-256 sering dipakai untuk memeriksa apakah data berubah, membandingkan berkas, atau membentuk sidik jari data. Hash bukan enkripsi: hasilnya tidak dirancang untuk dikembalikan menjadi teks asli. Hash biasa juga bukan cara yang tepat untuk menyimpan kata sandi.
async function sha256Hex(text) {
const bytes = new TextEncoder().encode(text);
const digest = await crypto.subtle.digest("SHA-256", bytes);
return Array.from(new Uint8Array(digest))
.map(byte => byte.toString(16).padStart(2, "0"))
.join("");
}
sha256Hex("contoh data").then(console.log);Contoh tersebut mengubah teks menjadi byte UTF-8, menghitung digest SHA-256, lalu menampilkan hasil dalam format heksadesimal. Fungsi ini berguna untuk demonstrasi atau pemeriksaan integritas, tetapi hasil hash yang dihitung di browser tidak membuktikan bahwa data berasal dari pihak tepercaya. Untuk autentikasi, diperlukan mekanisme lain yang sesuai dengan model ancaman aplikasi.
Menghasilkan Token Acak yang Kuat
Jangan memakai Math.random() untuk token reset kata sandi, nilai anti-CSRF, atau rahasia lain yang dapat ditebak penyerang. Gunakan generator acak kriptografis. Contoh berikut menghasilkan 32 byte acak dan mengubahnya menjadi string heksadesimal.
function randomToken() {
const bytes = new Uint8Array(32);
crypto.getRandomValues(bytes);
return Array.from(bytes, b =>
b.toString(16).padStart(2, "0")
).join("");
}
console.log(randomToken());Nilai 32 byte menyediakan ruang kemungkinan yang besar, tetapi keamanan token juga bergantung pada cara token diterbitkan, masa berlaku, pembatasan penggunaan, dan penyimpanan. Token pemulihan akun sebaiknya dibuat dan divalidasi oleh server. Jangan mempercayai token yang hanya dibuat di browser sebagai bukti otorisasi.
Enkripsi dan Tanda Tangan Digital
SubtleCrypto juga mendukung algoritma seperti AES-GCM untuk enkripsi terautentikasi, HMAC untuk autentikasi pesan berbasis kunci bersama, serta algoritma tanda tangan digital. Pilihan algoritma harus mengikuti kebutuhan: hash untuk ringkasan, enkripsi untuk kerahasiaan, dan tanda tangan atau MAC untuk memeriksa keaslian serta integritas pesan.
Jangan merancang protokol kriptografi sendiri atau menyalin contoh tanpa memahami parameter dan pengelolaan kuncinya. Enkripsi yang kuat tetap gagal bila nonce digunakan ulang pada kondisi yang tidak diizinkan, kunci bocor, atau aplikasi menerima pesan tanpa memverifikasi autentikasinya. Untuk data sensitif, rancangan sistem sebaiknya ditinjau oleh orang yang memahami keamanan kriptografi.
Kunci yang dibuat melalui crypto.subtle.generateKey() direpresentasikan sebagai objek CryptoKey. Pengembang perlu menentukan algoritma, tujuan penggunaan, dan apakah kunci boleh diekspor. Jika kunci memang perlu dipertahankan antar-sesi, IndexedDB dapat menyimpan objek CryptoKey pada browser yang mendukungnya. Namun, penyimpanan lokal tidak otomatis melindungi data dari akses perangkat atau skrip berbahaya pada origin yang sama. Rancang pemulihan, rotasi, dan pencabutan kunci sebelum fitur dirilis.
Kesalahan Umum yang Perlu Dihindari
- Menganggap hash sebagai enkripsi. Hash tidak menyediakan cara untuk memulihkan data asli.
- Menghash kata sandi dengan SHA-256 biasa. Gunakan mekanisme penyimpanan kata sandi di sisi server yang dirancang untuk itu, misalnya Argon2id, scrypt, atau bcrypt sesuai dukungan dan kebijakan sistem.
- Menyimpan rahasia di kode JavaScript. Apa pun yang dikirim ke browser pada dasarnya dapat diperiksa pengguna. Kunci privat dan kredensial server tidak boleh ditanam dalam bundle front-end.
- Menganggap kunci non-extractable menyelesaikan semua risiko. Pengaturan itu membatasi ekspor melalui API, tetapi skrip berbahaya yang berjalan dalam origin yang sama mungkin tetap dapat meminta operasi memakai kunci tersebut.
- Mengabaikan HTTPS dan XSS. Konteks aman melindungi transportasi, tetapi celah injeksi skrip dapat membuat fungsi kriptografi dipakai untuk tujuan yang tidak diinginkan.
Panduan OWASP Cryptographic Storage Cheat Sheet menekankan pemilihan algoritma yang teruji, pengelolaan kunci, dan penghindaran kriptografi buatan sendiri.
Checklist Sebelum Digunakan di Produksi
Pastikan aplikasi berjalan pada HTTPS, tentukan dengan jelas apakah kebutuhan sebenarnya adalah hashing, enkripsi, atau autentikasi, dan pilih algoritma yang sesuai. Uji kegagalan saat API tidak tersedia, jangan mencatat token atau material kunci ke log, batasi masa berlaku rahasia, dan sediakan prosedur rotasi serta pencabutan. Data yang tersimpan di browser juga harus dianggap dapat diakses oleh pengguna perangkat dan skrip yang berhasil berjalan pada origin tersebut.
Lakukan pengujian dengan data contoh yang tidak sensitif dan tinjau hasilnya pada browser yang benar-benar didukung. Hindari memasukkan kunci produksi ke konsol pengembang atau membagikan tangkapan layar yang memuat token. Untuk aplikasi penting, catat keputusan algoritma dan alasan pemilihannya agar tim lain dapat meninjau serta merawat implementasi dengan konsisten.
Kesimpulan
Web Crypto API memberi pengembang akses ke primitif kriptografi standar tanpa perlu membuat algoritma sendiri. crypto.subtle.digest() cocok untuk hashing, sedangkan crypto.getRandomValues() sesuai untuk menghasilkan nilai acak yang kuat. Namun, pemilihan algoritma hanyalah satu bagian dari keamanan. Pengelolaan kunci, validasi di server, perlindungan terhadap XSS, dan desain alur autentikasi sama pentingnya. Gunakan API ini sebagai komponen dari rancangan yang telah diuji, bukan sebagai jaminan keamanan otomatis.
