Apa yang dibuktikan oleh JWT yang dinyahkodkan
Penyahkod JWT menunjukkan kepada anda perkara yang dituntut oleh token. Ia tidak dapat menunjukkan kepada anda sama ada dakwaan tersebut adalah benar. Panduan ini merangkumi apakah ketiga-tiga segmen itu, penyahkodan yang dilakukan dan tidak diwujudkan, dan serangan yang hidup dalam jurang antara kedua-duanya.
Tiga segmen, dua daripadanya sahaja JSON
JWT dalam bentuk biasa ialah JWS: tiga segmen base64url dipisahkan oleh titik. Yang pertama ialah pengepala, yang kedua muatan, yang ketiga tandatangan.
Pengepala dan muatan ialah objek JSON biasa yang telah dikodkan base64url. Dikodkan, bukan disulitkan. Sesiapa sahaja yang memegang token boleh membaca kedua-duanya, serta-merta, tanpa kunci — itu bukan kecacatan, ia adalah reka bentuk. JWT ialah penyata yang ditandatangani, bukan sampul surat yang dimeterai. Tandatangan itu menjamin bahawa kenyataan itu tidak diubah; ia tidak melakukan apa-apa untuk merahsiakannya.
Akibatnya patut dinyatakan dengan jelas kerana ia sering terlepas: jangan sekali-kali meletakkan apa-apa rahsia dalam muatan JWT. Bukan kata laluan, bukan pengecam kebangsaan penuh, bukan butiran sistem dalaman. Anggapkan muatan adalah awam, kerana kepada sesiapa yang mempunyai token, ia adalah.
Segmen ketiga ialah tandatangan, dikira daripada dua yang pertama. Ia adalah satu-satunya bahagian yang membawa sebarang nilai keselamatan, dan ia adalah bahagian yang tidak boleh dinilai oleh penyahkod.
Penyahkodan yang membuktikan: tiada apa-apa
Inilah maksud keseluruhan panduan. Menyahkod JWT menghuraikan dua rentetan base64url ke dalam JSON. Ia mengesahkan bahawa token itu terbentuk dengan baik. Ia tidak mengesahkan bahawa token itu tulen, bahawa ia telah dikeluarkan oleh pihak yang dinamakan dalam tuntutan "iss", bahawa tuntutan itu belum disunting, atau bahawa ia pernah sah.
Sesiapa sahaja boleh membina token. Ambil mana-mana JWT, tukar "peranan": "pengguna" kepada "peranan": "pentadbir", kod semula muatan, kopkan mana-mana tandatangan pada penghujungnya dan penyahkod akan memaparkan tuntutan anda yang diedit sama yakin seperti yang dipaparkan pada asal. Ia tidak mempunyai cara untuk mengetahui perbezaannya, kerana menyemak perbezaan adalah operasi berbeza yang memerlukan kunci yang tidak dimiliki oleh penyahkod.
Oleh itu, apabila penyahkod — yang ini, atau mana-mana yang lain — menunjukkan kepada anda "exp: 2026-01-01", apa yang sebenarnya diberitahu olehnya ialah: token ini mengandungi tuntutan bahawa ia tamat tempoh pada tarikh tersebut. Sama ada tuntutan itu bermakna apa-apa bergantung sepenuhnya pada sama ada tandatangan itu sah, yang belum disemak.
Alat ini menyahkod sahaja dan berkata demikian pada halaman, di sebelah hasil carian, setiap kali. Bukan dalam nota kaki. Sebabnya ialah penyahkod yang mendiamkan diri tentang perkara ini sedang melatih penggunanya membaca data yang tidak disahkan seolah-olah ia telah disahkan, dan tabiat itu adalah punca kepada seluruh keluarga pepijat pengesahan.
Mengapa alat ini tidak menawarkan pengesahan
Pengesahan memerlukan tiga perkara yang tidak boleh dimiliki oleh halaman web secara bertanggungjawab: kunci pengeluar, algoritma yang disematkan terlebih dahulu dan dasar tentang perkara yang perlu ditolak.
Kuncinya ialah masalah yang jelas. Untuk algoritma HMAC (HS256 dan rakan) kuncinya ialah rahsia yang dikongsi — rahsia yang sama digunakan untuk mencipta token. Menampalnya ke dalam halaman web bermakna menampal bukti kelayakan yang boleh mencetak token yang sah ke dalam halaman web. Untuk RSA dan ECDSA kunci awam bukan rahsia, tetapi anda masih perlu mengambil yang betul dari titik akhir JWKS yang betul dan percaya yang anda miliki.
Algoritma adalah masalah halus, dan sumber dua serangan yang terkenal. Yang pertama ialah alg: "tiada": pengepala mendakwa token tidak ditandatangani, dan pengesah yang menghormati pengepala dan bukannya konfigurasinya sendiri menerima apa-apa. Yang kedua ialah kekeliruan RS256-ke-HS256: penyerang mengambil kunci awam — iaitu, secara definisi, awam — menukar pengepala untuk menyebut HS256 dan menandatangani token menggunakan kunci awam itu sebagai rahsia HMAC. Pengesah yang membaca algoritma daripada token dan mencari "kunci" akan mengesahkannya.
Kedua-dua serangan datang daripada kesilapan yang sama: membiarkan token memberitahu pengesah cara menyemak token. Pengesah yang betul mengabaikan algoritma pengepala dan menggunakan algoritma yang dikonfigurasikan dengannya. Itu adalah keputusan milik sistem yang mempercayai token — bukan kepada alat kemudahan, dan bukan kepada sesiapa yang menampal sesuatu ke dalam borang.
Mengapa tidak menampal token pengeluaran di mana-mana sahaja
Token akses ialah bukti kelayakan pembawa. Itulah maksud "pembawa" dalam pengepala Kebenaran: sesiapa yang menanggungnya, ialah anda. Tiada faktor kedua dan biasanya tiada cara untuk memberitahu token yang dicuri daripada token yang sah. Sehingga ia tamat tempoh, ia adalah kunci yang berfungsi untuk akaun anda.
Jadi menampal token langsung ke mana-mana halaman web adalah menyerahkan bukti kelayakan ke halaman itu. Yang ini menyahkod segala-galanya secara setempat dan tidak membuat permintaan rangkaian selepas halaman dimuatkan — anda boleh mengesahkannya dalam panel rangkaian pelayar anda, dan anda sepatutnya, kerana ia mengambil masa sepuluh saat. Tetapi perhatikan apakah hujah itu sebenarnya: tuntutan, pada tapak web, bahawa tapak web itu boleh dipercayai. Setiap tapak yang mengeluarkan token membuat tuntutan yang sama, dan pelawat tidak dapat membezakannya dengan sepintas lalu.
Tabiat selamat tidak bergantung pada menilai tapak dengan betul. Gunakan token tamat tempoh, token persekitaran ujian atau token yang telah anda tempa untuk tujuan tersebut. Jika anda telah menampal token pengeluaran di suatu tempat — di mana-mana sahaja — putarkannya. Pembatalan adalah murah; kejadian tidak.
Perkara yang sama berlaku dengan lebih banyak kuasa untuk menandatangani kunci. Tiada sebab yang sah untuk menaip rahsia HMAC atau kunci peribadi ke dalam halaman web dan mana-mana tapak yang meminta satu untuk "mengesahkan" token anda meminta keupayaan untuk memalsukan token. Itulah sebab konkrit alat ini tidak mempunyai ciri pengesahan: ciri tersebut memerlukan permintaan.
Membaca tuntutan yang penting
RFC 7519 mendaftarkan set kecil nama tuntutan. "iss" ialah pengeluar, "sub" subjek token itu, "aud" khalayak yang dimaksudkan, "exp" tamat tempoh, "nbf" masa sah terawal, "iat" masa keluaran dan "jti" id unik untuk pengesanan ulangan. Semua yang lain adalah khusus aplikasi.
Tuntutan masa ialah nilai NumericDate: saat sejak zaman Unix, bukan milisaat. Perkara ini membuatkan orang ramai sentiasa terancam, kerana kebanyakan nilai masa JavaScript ialah milisaat. Token yang nampaknya tamat tempoh dalam 1970 biasanya telah diberikan nilai milisaat; yang nampaknya tamat tempoh dalam tahun 55000 biasanya mempunyai nilai kedua didarab dengan 1000 di suatu tempat.
"aud" patut diberi perhatian khusus apabila anda menyahpepijat. Token yang sah sepenuhnya masih boleh menjadi token yang salah, kerana ia dikeluarkan untuk khalayak yang berbeza. Pengesah yang menyemak tandatangan tetapi bukan penonton akan menerima token yang dicetak untuk perkhidmatan lain sepenuhnya — yang merupakan laluan peningkatan keistimewaan sebenar dalam sistem yang berkongsi pembekal identiti.
Alat ini memaparkan tuntutan masa dalam UTC, menandakan token tamat tempoh sebagai tamat tempoh dan memasangkannya dengan peringatan bahawa tuntutan tamat tempoh sahaja bermakna sesuatu jika tandatangan itu sah. Peringatan itu ada kerana "ia mengatakan ia belum tamat tempoh" ialah saat yang tepat tabiat data yang tidak disahkan merosakkannya.
Senarai semak pendek untuk sistem yang menjalankan amanah
Jika anda menulis kod yang menerima token dan bukannya sahaja memeriksa satu, berikut ialah versi ringkas tentang perkara yang dilakukan oleh pengesah yang betul.
- Sahkan tandatangan dahulu, dengan kunci yang anda peroleh daripada jalur, sebelum membaca sebarang tuntutan.
- Sematkan algoritma dalam konfigurasi anda sendiri. Jangan sekali-kali membacanya dari pengepala token. Tolak "tiada" tanpa syarat.
- Tandakan "exp" dan "nbf" pada jam yang dipercayai, dengan paling banyak toleransi yang kecil untuk condong.
- Semak "iss" dan "aud" terhadap nilai yang anda jangkakan. Tandatangan yang sah pada token yang dimaksudkan untuk orang lain masih merupakan token yang salah.
- Gunakan pustaka yang disemak untuk platform anda dan bukannya memasangnya sendiri. Setiap item dalam senarai ini ada padanya kerana pelaksanaan telah membuat kesilapan.
- Pastikan jangka hayat token pendek dan dapatkan laluan pembatalan. Token jangka pendek mengehadkan kerosakan kebocoran yang anda belum perasan lagi.
Apa yang berlaku kepada apa yang anda tampal
- Setiap penukaran, cincang, penyahkod dan perbezaan berjalan dalam tab pelayar anda. Tiada input dimuat naik, dilog atau disimpan pada pelayan, kerana tiada pelayan yang terlibat selepas halaman dimuatkan.
- Hashes datang daripada pelaksanaan Web Crypto sendiri pelayar, dan UUID daripada penjana rawak yang selamat secara kriptografi. Kedua-duanya tidak melibatkan panggilan rangkaian.
- Tiada apa-apa yang anda taip ditulis pada storan tempatan atau kuki. Memuat semula halaman akan membuangnya; menutup tab membuangnya.
- Analitis seluruh tapak berjalan sahaja pada hos pengeluaran kanonik yang dikonfigurasikan dan didedahkan dalam Dasar Privasi; tempatan dan hos pratonton menolaknya. Nilai, token, URL dan kandungan fail yang ditampal dikecualikan daripada acara analitis ToolAcre sendiri. Pengiklanan dilumpuhkan dalam konfigurasi semasa.
- Yang berkata: kunci JWT atau API ialah bukti kelayakan langsung. Tabiat selamat adalah jangan sekali-kali menampal satu ke halaman web yang anda tidak tulis, walau bagaimanapun boleh dipercayai dakwaannya — termasuk yang ini.
Soalan
Adakah alat ini mengesahkan tandatangan?
Tidak, dan ia tidak akan pernah. Ia menyahkod pengepala dan muatan dan menunjukkan kepada anda kandungannya. Ia tidak menyemak tandatangan, jadi tiada apa yang dipaparkan yang membuktikan token itu sahih, tidak diubah atau dikeluarkan oleh sesiapa sahaja yang dinamakannya.
Kemudian bagaimana saya tahu token itu tulen?
Dengan mengesahkan tandatangan dengan kunci pengeluar, menggunakan pustaka yang disemak, dengan algoritma disematkan dalam konfigurasi anda sendiri dan bukannya membaca daripada token. Itulah kerja untuk perkhidmatan yang mempercayai token, dalam persekitaran yang memegang kunci secara sah.
Adakah token saya dihantar ke mana-mana apabila saya menyahkodnya di sini?
Tidak. Penyahkodan berlaku dalam tab pelayar anda menggunakan JavaScript halaman itu sendiri dan halaman itu tidak membuat permintaan rangkaian selepas ia dimuatkan. Anda boleh mengesahkan ini dalam panel rangkaian pelayar anda. Anda masih tidak boleh menampal token pengeluaran ke dalam alat web sebagai satu kebiasaan, kerana tabiat itu harus berfungsi pada tapak yang tidak jujur mengenainya.
Mengapa sesiapa boleh membaca muatan JWT saya?
Kerana muatan adalah dikodkan base64url, bukan disulitkan. JWS ialah pernyataan yang ditandatangani, bukan yang dimeterai. Jika anda memerlukan kandungan tidak boleh dibaca, anda memerlukan JWE, format token yang disulitkan — dan kemudian penyahkod tidak boleh menunjukkan apa-apa kepada anda sama sekali tanpa kunci.
Apakah alg: "tiada"?
Nilai pengepala yang mengisytiharkan bahawa token tidak ditandatangani. Ia wujud dalam spesifikasi untuk konteks di mana integriti dijamin dengan cara lain dan ia adalah perangkap berdiri: pengesah yang mempercayai algoritma pengepala akan menerima sebarang token yang mendakwa "tiada". Alat ini membenderakannya apabila ia muncul.
Token saya mempunyai lima segmen dan tidak akan menyahkod. kenapa?
Lima segmen bermaksud JWE — token yang disulitkan — dan bukannya JWS yang ditandatangani. Kandungannya tidak boleh dibaca tanpa kunci penyahsulitan, jadi tiada apa-apa yang boleh ditunjukkan oleh penyahkod. Alat ini mengenal pasti kes itu secara eksplisit dan bukannya melaporkan kegagalan penghuraian yang tidak jelas.
Tamat tempoh kelihatan salah dengan faktor 1000.
JWT tuntutan masa ialah NumericDate: saat sejak zaman itu, bukan milisaat. Nilai yang dihasilkan oleh Date.now() adalah seribu kali terlalu besar. Utiliti cap masa dalam kit alat ini menukar antara keduanya dan sentiasa memberitahu anda unit yang digunakannya.
Adakah selamat untuk menyimpan JWT dalam localStorage?
Ia adalah pertukaran, bukan ya atau tidak. localStorage boleh dibaca oleh mana-mana JavaScript yang dijalankan pada asal anda, jadi satu kelemahan XSS menghilangkan token. Kuki httpOnly tidak boleh dibaca oleh JavaScript tetapi memerlukan perlindungan CSRF. Ringkasan yang jujur ialah kedua-duanya tidak percuma, dan keputusannya adalah milik model ancaman aplikasi anda.
Had
- Alat ini menyahkod sahaja. Ia tidak mengesahkan tandatangan, dan itu adalah keputusan reka bentuk kekal dan bukannya ciri yang hilang — lihat panduan di atas untuk sebabnya.
- Token yang disulitkan (JWE, lima segmen) tidak boleh dinyahkod sama sekali tanpa kunci. Alat itu mengenal pasti mereka dan berhenti.
- JWT bersarang — token yang muatannya sendiri adalah token — tidak dibuka secara automatik. Nyahkod token dalam sebagai langkah berasingan.
- Makna tuntutan melebihi set berdaftar yang ditakrifkan dalam RFC 7519 adalah khusus aplikasi, jadi alat menunjukkan nilainya tanpa mentafsirnya.
- Tamat tempoh yang ditunjukkan di sini sahaja menggambarkan perkara yang dituntut oleh token tentang dirinya sendiri. Sama ada tuntutan itu bermakna bergantung pada tandatangan yang tidak disemak oleh alat ini.
- Token yang lebih besar daripada 200,000 aksara ditolak. Mana-mana JWT sebenar adalah susunan magnitud yang lebih kecil.