Bahasa Melayu

Alat pembangun · Pengekod & penyahkod Base64

Base64 vs base64url: mengapa penyahkod standard menolak - dan _

· Bagaimana ia berfungsi

asas64 pengekodan aliran kerja pembangun

Penggantian abjad Base64 vs base64url
Ilustrasi vektor ToolAcre asal

base64url swap + dan / untuk - dan _ supaya output boleh bergerak dalam URL dan nama fail tanpa pelepasan aksara. Siaran ini menerangkan dua abjad, cara menukar antara abjad tersebut dan sebab padding biasanya digugurkan juga.

Token yang menyahkod di mana-mana kecuali kod anda — ralat aksara tidak sah yang disebabkan oleh satu - atau _

Segmen JWT gagal menyahkod dalam penyahkod Base64 standard dengan sempang penamaan ralat aksara tidak sah. Tetapi secara visual, tiada sengkang muncul. Lihat sekali lagi—ia betul. Versi base64url menggunakan - di mana Base64 standard menggunakan + dan _ di mana ia menggunakan /. Banyak penyahkod sahaja menerima satu abjad dan token yang dikodkan untuk keselamatan URL akan ditolak oleh kod yang mengharapkan RFC 4648 standard Base64.

Kedua-dua abjad adalah setara; menukar antara mereka adalah penggantian watak mekanikal. Masalah timbul kerana + dan / mempunyai makna dalam URL. Tanda tambah mewakili ruang dalam data borang application/x-www-form-urlencoded. Garis miring ke hadapan ialah pemisah laluan dalam URL. Jika anda membenamkan Base64 terus ke dalam parameter pertanyaan URL tanpa pengekodan peratus + dan penyahkod /, mungkin salah tafsirnya.

Mengapa + dan / adalah masalah dalam URL dan nama fail — makna terpelihara bagi / dalam laluan dan + sebagai ruang dalam data borang

A + boleh dibaca sebagai ruang sebelum mencapai penyahkod. A / boleh memisahkan nilai parameter di tempat yang salah. RFC 4648 bahagian 5 mentakrifkan abjad base64url untuk menghapuskan kekaburan: gunakan - bukannya + dan _ bukannya /, supaya output selamat dalam URL dan nama fail. Kedua-dua abjad adalah sama kecuali dua aksara.

Standard Base64 menggunakan aksara pada kedudukan 62 dan 63: A–Z (0–25), a–z (26–51), 0–9 (52–61), + (62), / (63). base64url menggunakan A–Z (0–25), a–z (26–51), 0–9 (52–61), - (62), _ (63). Segala-galanya—pengumpulan semula bit, peraturan padding, pemetaan bit kepada indeks—adalah sama. Rentetan indeks untuk Base64 standard akan menghasilkan rentetan indeks untuk base64url; sahaja watak pada kedudukan 62 dan 63 akan berbeza.

Abjad base64url daripada RFC 4648 bahagian 5 — dua aksara yang digantikan dan mengapa tiada lagi perubahan

Jika input tidak mengandungi indeks 62 atau 63 (tiada + atau / dalam standard, tidak - atau _ dalam base64url), kedua-dua abjad menghasilkan output yang sama. Menukar Base64 standard kepada base64url adalah mudah untuk mencari-dan-ganti: swap + untuk - dan / untuk _. Menyahkod rentetan base64url dalam Base64 standard memerlukan terbalik: swap - untuk + dan _ untuk /.

Penukaran adalah simetri dan sentiasa sah. Jika anda menemui token yang gagal menyahkod dengan penamaan ralat aksara tidak sah - atau _, semak sama ada penyahkod menerima base64url. Jika tidak, gunakan penggantian aksara, dan jika input dibentuk dengan baik, penyahkodan seharusnya berjaya. Pertimbangkan JWT pengepala {"alg":"HS256","typ":"JWT"} dikodkan sebagai base64url. UTF-8 bait standard melalui pengumpulan semula bit: tiga bait menjadi empat indeks, dicari dalam abjad base64url. ToolAcre mendedahkan padding sebagai pilihan pengekod daripada mengikatnya pada togol abjad. Pemisahan itu adalah bukti berguna: URL-output selamat mungkin berlapik atau tidak berlapik, manakala penyahkod menormalkan sama ada bentuk sebelum memanggil pelayar primitif. Abjad dan padding adalah konvensyen yang berkaitan, bukan satu suis.

Padding dalam base64url adalah pilihan mengikut konvensyen — mengapa JWT meninggalkan = dan bagaimana penyahkod boleh memulihkannya dari panjang

Apabila indeks ialah 62, aksara output ialah -; apabila 63, output ialah _. Bait yang sama melalui abjad standard akan menghasilkan + pada indeks 62 dan / pada indeks 63. Menukar hasil base64url kepada standard ialah operasi aksara demi aksara: imbas untuk - dan gantikan dengan +, imbas untuk _ dan gantikan dengan /, kemudian nyahkod seperti biasa.

Bait yang anda pulihkan adalah sama kerana indeks adalah sama; sahaja simbol berbeza. Pelapisan dalam base64url adalah pilihan mengikut konvensyen, walaupun standard membenarkannya. JWT distrukturkan sebagai tiga segmen base64url yang digabungkan dengan titik; setiap segmen menggunakan padding jika diperlukan, tetapi banyak pelaksanaan meninggalkannya dan bergantung pada fakta bahawa aplikasi yang menggunakan mengetahui panjang bait yang dijangkakan.

Contoh yang berjaya: menukar segmen pengepala JWT kepada Base64 standard — menggantikan aksara, menambah padding, penyahkodan kepada JSON

Penyahkod boleh memulihkan pelapik yang hilang dengan membahagikan panjang rentetan dengan empat, mengira baki, menambahkan 0, 1 atau 2 sama dengan tanda. Jika panjang rentetan bukan gandaan empat, padding yang hilang adalah jelas. Jika panjang adalah gandaan empat, rentetan sama ada berlapik kemudian padding dilucutkan, atau input sudah berbilang daripada empat bait (berakhir dengan tiga bait dalam blok akhir, tidak memerlukan pelapik).

Menggabungkan segmen base64url memerlukan perhatian pada padding. Jika tiga segmen setiap satu berakhir dengan =, penggabungan terus menghasilkan rentetan seperti AAAA=BBBB=CCCC=, dengan padding di tengah kini menjadi aksara sesat, bukan penamat penamat. Inilah sebabnya mengapa JWT meninggalkan padding dalam setiap segmen: struktur tiga segmen adalah eksplisit, jadi penyahkodan diteruskan secara bebas pada setiap bahagian, dan padding di tengah-tengah rentetan bercantum adalah tidak diperlukan dan akan memecahkan penghuraian.

Kesilapan biasa — mencampur abjad dalam satu rentetan, atau pengekodan peratus standard Base64 dan bukannya menggunakan base64url

Jika membina muatan berbilang segmen, tentukan konvensyen pelapik pada permulaan: sama ada masukkan dalam setiap segmen dan jangan sekali-kali digabungkan secara langsung, atau tinggalkan dan pulihkan dari panjang sahaja apabila penyahkodan. RFC 4648 standard ialah kuasa pada kedua-dua abjad. Bahagian 4 menentukan Base64 standard; bahagian 5 menentukan base64url. Setiap penyahkod yang mematuhi mesti menyatakan dengan jelas abjad yang diterimanya.

Kod yang menerima base64url tetapi bukan Base64 standard (atau sebaliknya) sahaja melaksanakan subset. Abjad base64url wujud untuk keserasian dengan URL dan kekangan nama fail; ia bukan penambahbaikan atau penggantian, sahaja varian untuk konteks tertentu. Apabila anda mengarang API atau format token, pilih satu abjad dan dokumen yang mana satu. Kesilapan biasa ialah pengekodan peratus standard Base64 dan bukannya menggunakan base64url. Pelaksanaan juga menerangkan sempadan artikel. Ia menormalkan tanda sempang dan garis bawah sebelum penyahkodan, tetapi ia tidak mengesahkan tandatangan token atau mentafsir tuntutan. Menukar segmen JWT kepada bait boleh mendedahkan JSON; ia tidak dapat menentukan siapa yang mengeluarkan JSON itu atau sama ada sesiapa mengubahnya.

Perkara ini tidak meliputi — mengesahkan JWT tandatangan, base32 dan pengekodan RFC 4648 yang lain

%2B ialah kod peratus untuk +; %2F ialah kod peratus untuk /. Pengekodan peratus menukar TWFu kepada TWFu tidak berubah (tiada aksara khas) tetapi TE9S+g== kepada TE9S%2Bg%3D%3D (terlalu banyak aksara untuk dikendalikan). Penyelesaian yang betul ialah menggunakan base64url, yang telah menghasilkan URL-output selamat. Pengekodan peratus Base64 adalah berlebihan dan membazir. Gunakan abjad yang betul untuk konteks. Pengekod & penyahkod Base64 menerima kedua-dua abjad secara automatik.

Jika anda menampal rentetan yang mengandungi -, ia menganggapnya sebagai base64url; jika tampal rentetan yang mengandungi +, ia menganggapnya sebagai Base64 standard. Alat juga menerima URL dan menganggapnya sebagai input yang URL-selamat. Oleh itu, semakan praktikal mempunyai dua keputusan bebas: bait perjalanan pergi dan balik, dan perwakilan yang dipilih sesuai dengan salurannya. Melepasi yang pertama mengatakan bahawa transformasi boleh diterbalikkan. Melepasi yang kedua mengatakan tanda baca dan padding tidak akan ditulis semula oleh URL, nama fail, kuki atau protokol yang membawanya.

Bawa pulang: dua abjad, susun atur satu bit — cara pengekod & penyahkod Base64 mengendalikan abjad standard dalam pelayar, dan tempat halaman alatnya menyatakan perkara yang diterima

Apabila menyahkod segmen JWT atau token selamat URL, anda boleh menampal terus tanpa penukaran dan alat mengenal pasti abjad daripada konteks. Penyahpepijatan gagal penyahkod menjadi mudah: tampal token, lihat jika alat menerimanya dan jika tidak, tukar aksara secara manual dan cuba lagi.

Penggantian itu sendiri ialah satu baris kod, tetapi penyahkod yang gagal juga boleh datang daripada panjang yang mustahil, padding yang salah letak, rasuah atau input bukan Base64. Alat ini menormalkan kedua-dua abjad secara automatik, jadi penerimaan sahaja mengesahkan bahawa bait boleh dipulihkan. Muatan JWT yang dinyahkod masih merupakan tuntutan yang belum ditandatangani sehingga pengesah berasingan menyemak tandatangan dan algoritma yang dijangkakan.