Bahasa Melayu

Alat pembangun · Pengekod & penyahkod Base64

RFC 4648 menerangkan: standard yang mentakrifkan Base64, base32 dan base16

· Latar belakang

asas64 pengekodan

RFC 4648 keluarga abjad: base64, base64url, base32, base32hex, base16
Ilustrasi vektor ToolAcre asal

RFC 4648 ialah dokumen ringkas dan boleh dibaca di sebalik setiap pelaksanaan Base64. Siaran ini membincangkan perkara yang dinyatakan, perkara yang sengaja dibiarkan terbuka dan sebab pelaksanaan masih berbeza.

Dua perpustakaan, dua jawapan untuk rentetan yang sama — teka-teki kesalingoperasian sebenar yang sahaja standard diselesaikan

Dua perpustakaan JavaScript boleh mengembalikan Base64 yang berbeza untuk rentetan yang sama, setiap satu menuntut ketepatan. RFC 4648 ialah dokumen dua belas muka surat yang boleh dibaca yang sepatutnya menyelesaikan percanggahan tersebut, namun pelaksanaan masih berbeza kerana RFC sengaja menyerahkan keputusan tertentu kepada permohonan. Artikel ini membincangkan perkara yang RFC 4648 tentukan, perkara yang sengaja diserahkan kepada pemanggil dan sebab membaca standard sekali gus menyelesaikan kebanyakan teka-teki kesalingoperasian sebenar. Alat pengekod & penyahkod Base64 termasuk RFC 4648 vektor ujian supaya anda boleh mengesahkan pelaksanaan terhadap contoh yang berwibawa.

RFC 4648 menggantikan dan menyatukan beberapa dokumen terdahulu: Base64 daripada MIME (RFC 2045), Base64 daripada Mel Dipertingkatkan Privasi (RFC 1421), asas32 daripada S/MIME (RFC 2630) dan base16 daripada pelbagai sumber. Penggabungan itu perlu kerana MIME dan PEM masing-masing mempunyai abjad dan peraturan mereka sendiri, dan MIME pembalut baris bercanggah dengan PEM's 64-blok lajur. RFC 4648 mentakrifkan lima keluarga pengekodan di satu tempat: base64, base64url, base32, base32hex dan base16, masing-masing dengan abjad sendiri, peraturan padding dan contoh vektor ujian. Abjad asas64 ialah A-Z, a-z, 0-9, tambah dan potong, dalam susunan itu.

Perkara yang ditetapkan oleh vektor pelaksanaan dan ujian — abjad standard dan URL-selamat, padding dan pengendalian ruang kosong

Setiap aksara mewakili 6 bits; tiga bait input (24 bits) memetakan kepada empat aksara output. Abjad tidak sewenang-wenangnya: ia mengelakkan aksara yang berbeza antara EBCDIC dan ASCII, mengelakkan aksara kawalan, petikan dan garis miring ke belakang yang perlu dilarikan dalam literal rentetan C. Varian base64url menggantikan tambah dengan sempang dan sengkang dengan garis bawah untuk mengelakkan aksara terpelihara dalam URL dan nama fail. Kedua-dua varian adalah sama sah; RFC 4648 bahagian 2 menentukan base64, bahagian 5 menentukan base64url dan aplikasi mesti menyatakan yang mana yang digunakan.

Padding dengan aksara yang sama membawa output kepada gandaan empat aksara. Jika input ialah 1 byte (8 bits), output ialah dua aksara ditambah dua tanda sama. Jika input ialah 2 bytes (16 bits), output ialah tiga aksara campur satu tanda sama. Jika input ialah gandaan 3 bytes, tiada pelapik diperlukan. Sesetengah aplikasi meninggalkan padding atau membenarkan padding hilang pada penyahkod; RFC 4648 bahagian 3.2 mentakrifkan pengekodan kanonik seperti sentiasa berlapik, tetapi bahagian 3.3 menyatakan bahawa penyahkod mungkin menerima pelapik yang tiada untuk keserasian.

Abjad yang digunakan oleh alat ini — Base64 dan Base64url standard; pangkalan lain kekal di luar skopnya

Perbezaan padding adalah sebab pelaksanaan tidak bersetuju: penyahkod yang ketat menolak sama yang hilang, manakala yang berlembut menerimanya. RFC 4648 secara eksplisit mengatakan: aksara pad yang sama lazimnya dikodkan peratus apabila digunakan dalam URL, jadi jika output base64url digunakan secara langsung dalam parameter URL, pad tidak diperlukan dan harus ditinggalkan. Ayat ini ialah satu sebab URL-mod selamat dan peninggalan padding sering digandingkan, walaupun ia adalah pilihan bebas. Bahagian 5 (base64url) tidak melarang pelapik; ia sahaja mencatatkan amalan biasa.

Pemanggil yang memilih base64url mesti memutuskan sama ada padding diperlukan untuk sistem penerima. Aksara bukan abjad dalam input dikendalikan secara berbeza oleh penyahkod yang berbeza. RFC 4648 bahagian 3.1 menyatakan: Pelaksanaan MUST menolak pengekodan jika ia mengandungi aksara di luar abjad asas. Walau bagaimanapun, bahagian 3.3 menyatakan bahawa MIME Base64 (RFC 2045) membenarkan pemisah baris untuk pembalut aksara 76 dan penyahkod untuk MIME mesti melangkau ruang kosong. RFC membezakan antara penyahkodan ketat (tolak semua bukan abjad) dan penyahkodan serasi MIME (langkau ruang kosong, tolak aksara lain).

Padding, aksara bukan abjad dan pengekodan kanonik — bahagian yang menerangkan kebanyakan percanggahan penyahkod

Permohonan mesti memilih peraturan yang harus diikuti; piawaian mentakrifkan kedua-duanya. Base32 menggunakan A-Z dan 2-7 (32 aksara jumlah), mengekod lima bait input (40 bits) kepada lapan aksara output. Base32hex menggantikan 0-9 dan a-v untuk aksara abjad, berguna dalam konteks di mana huruf kecil lebih disukai.

Tapak16 ialah perenambelasan: 0-9 dan a-f. Base32 dan base32hex mempunyai peraturan pelapik mereka sendiri dalam bahagian 6 dan 7, dan RFC menyediakan vektor ujian berasingan untuk setiap abjad. Kebanyakan pembangun sahaja memerlukan base64 dan base64url; base32, base32hex dan base16 disertakan dalam RFC untuk kesempurnaan dan untuk aplikasi seperti rahsia TOTP (RFC 4226) dan pengekodan DNS.

Pilihan aplikasi boleh dilihat dalam pelaksanaan ini — pembalut baris, penyahkodan teks yang ketat dan pengendalian ralat

Vektor ujian dalam RFC 4648 ialah kebenaran asas untuk menyemak pelaksanaan. Pengekodan rentetan f, fo, foo, foob, fooba dan foobar menghasilkan output base64 khusus: Zg==, Zm8=, Zm9v, Zm9vYg==, Zm9vYmE= dan Zm9vYmFy. Pelaksanaan yang menghasilkan output yang berbeza untuk rentetan ini adalah tidak betul. RFC menyediakan vektor ujian yang setara untuk base32, base32hex dan base16. Alat pengekod & penyahkod Base64 termasuk vektor ini supaya anda boleh mengesahkan outputnya terhadap standard. Pembalut baris ialah kebimbangan MIME, bukan kebimbangan asas64.

RFC 2045 menentukan 76-garisan aksara; RFC 4648 bahagian 3.1 mencatatkan ini dalam konteks MIME tetapi tidak menjadikannya keperluan base64 itu sendiri. Sesetengah aplikasi membalut pada 64 aksara (standard PEM asal); yang lain tidak membalut langsung. Penyahkod base64 RFC 4648 yang ketat beroperasi pada abjad dan padding sahaja. Penyahkod serasi MIME mesti melangkau pemisah baris (CR, LF, CRLF). Aplikasi yang menggunakan base64 di luar MIME tidak seharusnya menambah pemisah baris melainkan sistem penerima memerlukannya; RFC tidak mentakrifkan pembalut garisan sebagai sebahagian daripada asas64.

Contoh yang berjaya: vektor ujian RFC sendiri — mengekodkan awalan 'foobar' dan menyemaknya dalam pelayar

Pengendalian ruang kosong ialah satu lagi titik varians pelaksanaan. RFC 4648 mengatakan penyahkod yang ketat mesti menolak aksara bukan abjad. MIME-berbalut base64 (RFC 2045 base64) membenarkan ruang kosong untuk pemformatan. Kedua-dua piawaian bersetuju tentang bait keluaran yang sepatutnya tetapi berbeza pada input yang sah. Kebanyakan pelaksanaan JavaScript memilih keserasian MIME dan langkau ruang kosong; peraturan ketat jarang digunakan dalam pelayar. Pengekod & penyahkod Base64 menerima kedua-dua ruang kosong yang mengandungi (MIME) dan input yang ketat, menjadikan perbezaan itu jelas. Penyahkodan kanonik vs. pemaaf ialah varians utama terakhir.

Penyahkodan kanonik mengikuti bahagian RFC 4648 3.2: tolak padding yang tidak sempurna, tolak padding yang hilang, tolak aksara bukan abjad. Penyahkodan memaafkan, digunakan dalam piawaian web (spesifikasi HTML memanggilnya forgiving-base64), menambah peraturan: abaikan ruang kosong, terima padding yang tiada, benarkan sempang dan garis bawah sebagai setara dengan garis miring walaupun dalam mod standard base64. JavaScript's atob() memaafkan; penyahkod RFC 4648 yang ketat adalah lebih ketat. Tidak salah; mereka melayani konteks yang berbeza. Data membaca aplikasi daripada pengguna atau daripada rangkaian harus mengetahui peraturan mana yang diharapkan oleh pihak lain.

Perkara yang tidak dilindungi ini — dokumen MIME dan PEM sendiri dan API khusus bahasa

RFC meninggalkan sembilan pilihan kepada aplikasi: yang mana antara lima abjad, sama ada memerlukan atau membenarkan pelapik, sama ada memerlukan atau membenarkan ruang kosong, sama ada untuk menganggap garis bawah sempang sebagai bersamaan sengkang, cara melaporkan ralat, cara mengendalikan input akhir, sama ada menerima padding yang hilang, berapa banyak saiz bait keluaran dan cara untuk memperuntukkan bait keluaran. Pilihan ini menerangkan sebab dua pelaksanaan RFC 4648 boleh tidak bersetuju pada input yang sama. Baca RFC sekali; semak pelaksanaan anda terhadap vektor ujiannya; nyatakan pilihan yang digunakan oleh aplikasi anda; menguji kebolehoperasian dengan rakan sebaya sebenar, bukan andaian.

Memahami RFC 4648 menyelesaikan kebanyakan pertikaian Base64 kerana perselisihan pendapat biasanya bukan mengenai RFC itu sendiri tetapi mengenai pilihan yang dipilih oleh setiap pihak. RFC cukup ringkas untuk dibaca dari hujung ke hujung dalam masa sejam. Piawaian mentakrifkan abjad, menyediakan vektor ujian dan memberi amaran di mana pelaksanaan mesti memutuskan. Alat pengekod & penyahkod Base64 membolehkan anda bereksperimen dengan vektor ujian dan melihat abjad standard dalam tindakan. Kebanyakan penggunaan base64 setiap hari tidak memerlukan pengetahuan RFC yang mendalam; tetapi apabila menyahpepijat pengekodan tidak sepadan atau menyepadukan dengan API yang tidak dikenali, membaca standard itu sekali gus mengalih keluar tekaan.

Bawa pulang: baca standard sekali — cara pengekod & penyahkod Base64 memberi anda cara cepat untuk menyemak vektor ujian abjad standard

RFC 4648 ialah penyatuan amalan pengekodan asas ad-hoc selama beberapa dekad kepada satu spesifikasi yang boleh dibaca. Ia tidak menentukan masa untuk menggunakan base64 (MIME, PEM, JWT, URI data, dsb. masing-masing mempunyai spesifikasi tersendiri); ia mentakrifkan apa itu base64. Dengan mentakrifkan lima keluarga pengekodan dan menyatakan pilihan yang berkanun, RFC memungkinkan untuk menyemak sama ada pelaksanaan adalah betul. Vektor ujian berwibawa ialah titik permulaan: jika pelaksanaan anda mengekod foobar dan menghasilkan apa-apa selain Zm9vYmFy, RFC mengatakan pelaksanaan itu salah.

Gunakan kuasa itu sebagai pusat pemeriksaan pengesahan: kodkan setiap RFC vektor ujian, bandingkan aksara yang tepat, dan kemudian nyahkod hasilnya untuk mengesahkan bahawa bait asal tidak berubah. Semakan berasaskan pelayar ini memisahkan abjad atau kesilapan padding daripada masalah di tempat lain dalam penyepaduan, sambil mengekalkan standard itu sendiri sebagai rujukan dan bukannya bergantung pada label perpustakaan.