Pengesahan adalah pengawal pintu pada aplikasi anda. Setiap kali seseorang mendaftar atau log masuk, sistem anda perlu memutuskan sama ada mereka adalah individu yang mereka dakwa. Jika tersilap, anda bukan sekadar menyahpepijat (debugging) kegagalan log masuk. Anda sedang mempertaruhkan data pengguna sebenar yang boleh dicuri dengan mudah. Melakukan perkara ini dengan betul memerlukan dua alatan yang boleh dipercayai: Bcrypt untuk melindungi kata laluan semasa disimpan (at rest), dan JSON Web Tokens untuk mengesahkan identiti semasa pengguna melayari aplikasi anda.
Mengapa Penyimpanan Teks Biasa (Plaintext) Gagal
Jika anda hanya mahu mengambil satu peraturan daripada artikel ini, ambillah yang ini: jangan sekali-kali menyimpan kata laluan sebagai teks biasa (plaintext) dalam pangkalan data anda. Tidak kira sama ada pangkalan data anda berada di sebalik tembok api (firewall) atau jika anda mempercayai setiap jurutera dalam pasukan. Menulis kata laluan ke dalam jadual dalam bentuk mentah adalah seperti meninggalkan kunci rumah di bawah alas kaki. Sebaik sahaja seseorang mendapat akses ke pangkalan data tersebut—melalui API yang salah konfigurasi, sandaran (backup) yang bocor, atau serangan suntikan (injection attack)—setiap kredential akan terdedah serta-merta.
Kerosakan akan berlipat ganda kerana orang ramai menggunakan semula kata laluan yang sama. Satu pencerobohan boleh menjejaskan bukan sahaja aplikasi anda, tetapi juga e-mel, perbankan, dan akaun media sosial pengguna. Inilah sebabnya kita melakukan pengisaran (hashing) pada kata laluan. Hashing mengubah kata laluan menjadi rentetan rawak yang tidak mempunyai sebarang persamaan ketara dengan yang asal. Proses ini adalah sehala dan tidak boleh diubah semula. Anda tidak boleh menuangkan "asid matematik" ke atas hash dan melarutkannya kembali menjadi kata laluan asal yang menghasilkannya.
Mengisarkan Kata Laluan dengan Bcrypt
Bcrypt ialah fungsi pengisaran yang dibina khusus untuk kata laluan. Ia mengambil rentetan biasa, melaluinya melalui cipher Blowfish, dan mengembalikan hasil yang kelihatan seperti $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy. Awalan tersebut memberitahu anda algoritma dan faktor kos (cost factor). Bahagian hujung yang panjang adalah gabungan salt dan hash itu sendiri.
Salt ialah data rawak yang dicampurkan ke dalam kata laluan sebelum proses hashing bermula. Oleh kerana salt adalah unik bagi setiap pengguna, dua orang yang memilih "password123" akan berakhir dengan hash yang berbeza sama sekali dalam pangkalan data anda. Perbezaan kecil ini menewaskan jadual pelangi (rainbow tables)—kamus hash yang telah dikira terlebih dahulu untuk kata laluan biasa—kerana penyerang perlu menjana semula keseluruhan jadual bagi setiap salt yang unik.
Bcrypt juga sengaja dibuat perlahan. Perkakasan moden boleh meneka berbilion hash sesaat dengan algoritma pantas seperti SHA-256. Bcrypt pula sengaja melambat-lambatkan prosesnya. Ia menjalankan proses hashing berulang kali, dikawal oleh faktor kos yang boleh anda tingkatkan apabila komputer menjadi lebih pantas. Kelambatan itu menghukum sesiapa sahaja yang cuba melakukan serangan brute-force terhadap pangkalan data yang dicuri. Pengguna sah yang menunggu tambahan dua ratus milisaat semasa log masuk tidak akan menyedarinya. Penyerang yang cuba menguji berjuta-juta tekaan pasti akan menyedarinya.
Cara JSON Web Tokens Berfungsi
Jika Bcrypt mengendalikan pintu hadapan, JWT pula mengendalikan pas laluan koridor. JSON Web Token ialah rentetan ringkas dan selamat untuk URL yang membuktikan pengguna telah pun disahkan. Anggaplah ia sebagai kad pengenalan digital yang dikeluarkan oleh pelayan dan dibawa oleh klien.
Sebuah JWT mengandungi tiga segmen yang dipisahkan oleh titik: header, payload, dan signature. Header menentukan jenis token dan algoritma tandatangan. Payload membawa tuntutan (claims)—kenyataan tentang pengguna dan token itu sendiri—seperti ID pengguna, nama pengguna, dan cap masa tamat tempoh. Signature adalah meterai kriptografi. Pelayan menciptanya dengan menyandikan (encoding) header dan payload, kemudian melaluinya melalui kunci rahsia. Jika sesiapa mengubah suai payload, signature tidak lagi sepadan, dan pelayan akan menolak token tersebut serta-merta.
