API, Autentikasi, dan Keamanan · 3/7
Password: hashing, salting, dan jangan pernah menyimpan plaintext
Satu topik di mana menyalin jawaban Stack Overflow sembarangan bisa berakibat buruk bagi orang sungguhan.
Baca 28 menit
Setelah pelajaran ini kamu bisa
- Menjelaskan kenapa hashing bukan encryption
- Menjelaskan kenapa hash yang cepat adalah alat yang salah
- Menjelaskan apa yang dicegah oleh salt
- Membandingkan password dalam waktu konstan
Jangan pernah menyimpan password. Simpan sebuah hash — transformasi satu arah tanpa jalan kembali. Saat seseorang masuk, hash apa yang mereka ketik lalu bandingkan hash-nya.
Kenapa bukan SHA-256
SHA-256 adalah hash yang bagus dan alat yang salah di sini, karena satu alasan: ia cepat. Cepat itu keunggulan saat meng-hash sebuah file dan bencana saat meng-hash password, karena penyerang yang punya database-mu menebak secara offline, secepat yang diizinkan perangkat kerasnya.
SHA-256 sungguhan, lewat Web Crypto API yang sudah dimiliki browser-mu. Ukur berapa banyak tebakan yang diizinkannya.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Function hashing password dibuat lambat dan lapar memori dengan sengaja. Diukur di mesin yang menulis pelajaran ini: scrypt dengan N=16384 butuh 37,5 ms per hash, dibanding 0,018 ms untuk SHA-256 — kira-kira dua ribu kali lebih lambat. Itu 37,5 ms yang tidak kamu sadari saat login, dan pajak dua ribu kali lipat untuk setiap tebakan yang dibuat penyerang.
| Pakai | Untuk password? |
|---|---|
| argon2 | Ya — pilihan pertama saat ini |
| scrypt | Ya — dan sudah ada di dalam Node, itu sebabnya proyek ini memakainya |
| bcrypt | Ya — tua tapi masih layak |
| PBKDF2 | Bisa diterima kalau diwajibkan untuk kepatuhan |
| SHA-256, SHA-512, MD5 | Tidak. Cepat secara desain. |
Salt
Salt adalah data acak yang dicampurkan ke setiap password sebelum di-hash, dan disimpan bersama hasilnya. Artinya dua user dengan password sama mendapat hash berbeda.
Apa yang dicegah salt. Hashing sungguhan lagi — perhatikan kolom tanpa salt.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Membandingkan dalam waktu konstan
a === b pada string berhenti di karakter pertama yang berbeda. Itu membuatnya cepat saat jawabannya tidak — dan itu membocorkan informasi tentang seberapa banyak bagian nilainya yang sudah benar.
Kebocoran waktu, terukur. Bandingkan berapa karakter yang diperiksa masing-masing perbandingan.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Tugas praktik
Baca features/auth/password.ts di proyek ini dan features/auth/password.node.test.ts di sebelahnya. Temukan test bernama "rejects a truncated hash of the correct prefix" lalu hapus pemeriksaan expected.length !== KEY_LENGTH di implementasinya. Jalankan bun run test password dan lihat test itu gagal. Kembalikan lagi. Itulah nilai dari sebuah test keamanan.
Hasil yang diharapkan
Satu test gagal, dan itulah celah keamanannya tertangkap.
Cek pemahaman
Pilih jawaban dulu