Tautan ajaib: JWT vs string acak
Tutorial yang saya temukan tentang penerapan otentikasi tautan ajaib (dalam Node) merekomendasikan mekanisme seperti ini:
- pengguna mencapai titik akhir Anda dengan alamat email mereka
- Anda menghasilkan JWT yang ditandatangani dari email dan tanggal menggunakan kunci konstan (jika Anda sedikit lebih paham, Anda menggunakan
RS256skema asimetris alih-alih simetris yangHS256digunakan di sebagian besar tutorial (menjadi default saya pikir)) - kirim email dengan token sebagai parameter kueri
- klik pengguna, titik akhir terpukul, Anda memverifikasi JWT, lalu email dan tanggal di dalamnya
Permintaan maaf untuk pertanyaan otak yang mungkin sangat kecil , tetapi mengapa kita sebenarnya membutuhkan hashing atau enkripsi di sini?
Bukankah lebih bijaksana untuk hanya menghasilkan string alfanumerik yang besar (seperti 50 karakter), unik, acak (sebut saja
LURA) lalu menyimpannya, email dan tanggal dan mengirimkannya ke pengguna? Ketika titik akhir verifikasi dipukul, kita dapat mengatakan, "ya, saya menyimpan barang itu dan saya menerbitkannya 2 menit yang lalu, silakan" . Tujuan menggunakan JWT adalah untuk memverifikasi bahwa saya adalah orang yang membuat token (dengan kunci saya), tetapi saya juga dapat memverifikasi bahwa jika saya hanya melihat apakah saya memilikiLURAstring di file, bukan? Juga, JWT punya masalah . Saya merasa JWT dimaksudkan untuk digunakan ketika mesin yang memvalidasinya berbeda dari yang mengeluarkannya dan penggunaannya merusak keamanan dalam kasus ini.Pertanyaan bonus : Saya telah membaca beberapa kali tentang mengenkripsi kata sandi , itu
SHA256terlalu lemah pada tahun 2020 dan yang harus dipilihArgon2. Lalu mengapa adalahRS256pilihan yang baik jika "dipahami sebagai SHA 256 dengan kunci bit RSA 2048".
Jawaban
Bukankah lebih bijaksana untuk hanya menghasilkan string ... yang besar
Ya, itu akan. Token sering kali merupakan solusi langsung, dan lebih mudah dilakukan dengan benar. Solusi kriptografi sering kali memiliki kendala atau perlu diterapkan sepenuhnya dengan benar agar aman. Token acak lebih aman karena lebih sederhana.
JWT sangat berguna ketika memiliki banyak sistem: jika satu sistem menyediakan token untuk mengakses sistem lain, dan mereka tidak memiliki akses ke database yang sama.
SHA256 terlalu lemah di tahun 2020
SHA256 masih dianggap sebagai fungsi hash tujuan umum yang aman. Masalahnya adalah bahwa fungsi hash tujuan umum tidak cocok untuk mengenkripsi kata sandi, karena terlalu cepat. Karena komputer normal dapat menghitung miliaran hash SHA256 per detik, maka kata sandi dapat dipecahkan menggunakan miliaran tebakan per detik.
Namun, di JWT, SHA256 tidak digunakan untuk kata sandi tetapi untuk integritas pesan, jadi tidak ada masalah yang cepat. Tidak ada yang perlu ditebak.
Memang benar Anda dapat menggunakan string acak untuk tautan ajaib dan itu akan berfungsi dengan baik. Namun ada beberapa keuntungan memilih untuk mengimplementasikannya menggunakan JWT:
- Validasi JWT tidak memerlukan panggilan ke database. Ini mungkin manfaat utama menggunakan JWT sama sekali. Bergantung pada jumlah pengguna, ini dapat berarti perbedaan kinerja yang signifikan.
- Lebih mudah untuk mengintegrasikan dengan mekanisme login yang ada seperti penyedia identitas (mungkin pihak ketiga) yang sudah menangani pembuatan / verifikasi / penyimpanan token. Ini berguna misalnya jika aplikasi Anda sudah menggunakan token untuk memasukkan pengguna dengan kombinasi nama pengguna / kata sandi tradisional dan ingin menambahkan tautan ajaib sebagai opsi tambahan.
Adapun pertanyaan Anda tentang algoritme, untuk RS256 / HS256 di JWT tujuannya bukan untuk enkripsi tetapi untuk penandatanganan . Persyaratan pada algoritme untuk enkripsi dan penandatanganan aman berbeda (dan bahkan lebih berbeda jika berbicara tentang hashing sandi).
Sebagai catatan tambahan, alasan untuk memilih antara RS256 dan HS256 adalah apakah Anda berniat mengizinkan orang lain untuk memverifikasi token Anda atau tidak.
Untuk RS256 Anda membuat pasangan kunci publik / pribadi. Anda membuat tanda tangan menggunakan kunci pribadi sementara pihak ketiga dapat memverifikasi token yang Anda buat menggunakan kunci publik Anda. Untuk HS256, kunci untuk penandatanganan dan verifikasi sama jadi biasanya Anda merahasiakannya yang berarti hanya Anda yang dapat memverifikasi token.