Alat pembangun · Pengekod & penyahkod Base64
Base64 vs hex vs base32: membandingkan tiga cara untuk menulis bait sebagai teks
· Latar belakang
asas64 pengekodan
Hex, base32 dan Base64 menyelesaikan masalah yang sama dengan pertukaran yang berbeza dalam saiz, kebolehbacaan dan keselamatan. Siaran ini membandingkannya tentang ketumpatan, kepekaan kes, keselamatan URL dan kesilapan manusia.
Kekunci API yang tersilap taip kerana l, 1, I dan O — kegagalan kebolehbacaan konkrit yang tidak akan dialami oleh hex
Tiga cara biasa untuk mewakili bait sebagai teks ialah hex, base32 dan base64. Kesemuanya menyelesaikan masalah yang sama (menyatakan bait sewenang-wenang dalam ASCII boleh dicetak) tetapi dengan tukar ganti yang berbeza dalam saiz, kebolehbacaan dan daya tahan ralat. Hex ialah 2 aksara setiap bait (F3 A2 B1 ...), jadi 16 bytes menjadi 32 aksara. Base32 ialah 1.6 aksara setiap bait (kira-kira 5 aksara setiap 3 bytes), jadi 16 bytes menjadi 26 aksara.
Base64 ialah 1.33 aksara setiap bait (tepat 4 aksara setiap 3 bytes), jadi 16 bytes menjadi 24 aksara atau kurang. Jika saiz fail penting, base64 adalah paling padat. Jika transkripsi manusia penting, hex dan base32 adalah lebih selamat. Perbezaan kebolehbacaan adalah kritikal apabila nilai ditaip, disalin atau dituturkan. Hex menggunakan 0-9 dan a-f (tidak sensitif huruf besar-besaran dalam kebanyakan konteks). Saluran transkripsi mengubah keputusan kerana perwakilan yang dioptimumkan untuk mesin boleh menjadi janggal bagi orang ramai. Base64 adalah sensitif huruf besar dan menggunakan dua simbol tanda baca; hex menggunakan perbendaharaan kata visual yang lebih kecil. Pelaksanaan di sini menguji rentetan yang tepat, bukan kadar ralat manusia, jadi tiada kebarangkalian yang dicipta dilampirkan.
Ketumpatan: 2×, 1.6× dan 1.33× — berapa banyak aksara yang diperlukan oleh setiap pengekodan setiap bait dan mengapa
Base32 menggunakan A-Z dan 2-7, mengelak 0, 1, O dan I yang mudah terkeliru di atas kertas. Base64 menggunakan A-Z, a-z, 0-9, + dan /, termasuk kedua-dua huruf besar dan huruf kecil, menjadikannya sensitif huruf besar dan digit bercampur yang kelihatan serupa (0 berbanding O, 1 berbanding I lawan huruf kecil l). An API masukkan hex mungkin f3a2b1e4; bait yang sama dalam base64 mungkin 86KrvE== (dengan padding), atau dalam base32 6VEV7FI= (dengan padding).
Jika pengguna mesti menaip nilai dengan tangan, hex atau base32 adalah lebih selamat daripada base64. Watak terpelihara dalam URL penting. Hex dan base32 selamat untuk URL; kedua-duanya sahaja menggunakan aksara alfanumerik (hex juga menggunakan 0-9, base32 juga menggunakan 2-7). Base64 menggunakan tambah dan slash yang dikhaskan URL (tambah mewakili ruang dalam data berkod bentuk, slash ialah pemisah laluan). Ketumpatan Base64 mengikuti terus daripada enam bit berguna bagi setiap simbol output dan padding kepada blok empat aksara. Hex membawa empat bit setiap simbol, menjadikan dua aksara setiap bait. Base32 dibincangkan sebagai konteks perbandingan sahaja kerana repositori ini tidak menyediakan abjad mahupun pengekod untuk mengesahkan output.
Ketumpatan dari lebar bit — aritmetik Base64 dan heks tepat, dengan Base32 dianggap sebagai konteks perbandingan
Rentetan base64 dalam parameter URL mesti dikodkan peratus (tambah menjadi %2B, slash menjadi %2F), menambah 4 aksara tambahan untuk setiap kejadian. Base64url (RFC 4648 bahagian 5) menggantikan tambah dengan sempang dan slash dengan garis bawah, menjadikannya URL-selamat tanpa pengekodan peratus. Kebanyakan API yang menggunakan base64 dalam URL sebenarnya menggunakan base64url, tetapi perbezaannya selalunya tidak jelas dalam dokumentasi.
TOTP rahsia (kod yang digunakan oleh apl pengesah) biasanya diedarkan sebagai base32. Skrin pendaftaran TOTP menunjukkan rahsia asas32 kerana lebih mudah untuk menaip dan menyalin daripada bait yang sama dalam base64 atau hex. SHA ringkasan cincang sering dipaparkan dalam hex kerana ia adalah format tradisional dan kerana hex tidak peka huruf besar-besaran, menjadikan kesilapan silap kurang berkemungkinan. Kepekaan kes penting apabila seseorang membaca nilai dengan kuat atau menaip semula nilai itu, kerana menukar kes satu huruf mengubah indeksnya. ToolAcre mengekalkan kes dengan tepat dan akan menyahkod bait berbeza yang terhasil tanpa mengetahui manusia membuat ralat transkripsi. Perwakilan itu sendiri tidak mempunyai checksum.
Watak terpelihara dan keselamatan URL — di mana + dan / menggigit, dan cara base32 dan hex mengelakkan masalah
JWT menggunakan base64url. Jumlah semak fail mungkin hex atau base64; kedua-duanya adalah perkara biasa. Pilihannya adalah konvensyen sejarah, bukan keperluan teknikal. Ketahanan ralat adalah perbezaan yang halus tetapi penting. Base32 mengelakkan digit 0, 1, 8 dan 9 (yang kelihatan seperti huruf), mengurangkan ralat transkripsi. Base64 merangkumi semua digit, menjadikan 1 samar-samar (adakah ia huruf I, huruf kecil l, atau digit 1?).
Hex lebih terdedah kepada ralat: 0 kelihatan seperti O, saya kelihatan seperti 1. Jumlah semak yang mesti ditaip atau dibaca daripada cetakan adalah lebih selamat dalam base32. Kunci API yang ditampal terus daripada komputer adalah selamat dalam sebarang format; kebolehbacaan penting sahaja apabila mata manusia terlibat. Bait sama, tetapi pengekodan berbeza: jujukan 16-bait [0xf3, 0xa2, 0xb1, ...] menjadi f3a2b1... Tambah dan slash Standard Base64 memerlukan pengendalian sedar saluran; URL-mod selamat menggantikannya dengan sempang dan garis bawah. Hex mengelakkan pemisah tersebut dengan menggunakan digit dan huruf sahaja. Konvensyen Base32 berbeza-beza, jadi artikel ini mengelakkan sifat keselamatan yang menjanjikan yang tidak dilaksanakan atau diuji oleh repositori.
Contoh berfungsi: 16 bytes yang sama dalam ketiga-tiga pengekodan — perbandingan panjang dan pemeriksaan visual
dalam hex, 6VEV7FI=... dalam base32, dan 86KrvE== dalam base64. Tiada satu pun daripada rentetan ini boleh ditukar ganti. Aplikasi yang menerima f3a2b1... menjangkakan hex dan akan cuba menghuraikannya sebagai hex. Menerima 86KrvE== akan gagal jika aplikasi menjangkakan hex. Format pengekodan adalah sebahagian daripada kontrak data: pengirim dan penerima mesti bersetuju tentang pengekodan yang digunakan. Padding adalah satu lagi perbezaan.
Hex tidak menggunakan pelapik (4 bytes sentiasa 8 aksara hex, tiada pengecualian). Base32 dan base64 kedua-duanya menggunakan padding yang sama untuk menjajarkan output kepada berbilang aksara (8 untuk base32, 4 untuk base64). Padding adalah perlu secara matematik; ia memastikan bahawa setiap input n-bait menghasilkan kiraan aksara yang menentukan. Peraturan padding berbeza-beza: sesetengah aplikasi memerlukan padding, yang lain membenarkan ia ditinggalkan. Perbandingan yang dikerjakan menggunakan jujukan bait tetap dan mengira Base64 dan hex secara mekanikal. Panjang Base32nya boleh dibincangkan daripada pengumpulan lima bit, tetapi nilai teks Base32 yang tepat ditinggalkan kerana tiada pelaksanaan yang disemak menghasilkannya. Aritmetik panjang dan pengesahan output dikekalkan berbeza.
Di mana setiap satunya adalah konvensional — cincang dalam hex, TOTP rahsia dalam base32, JWT dan data: URI dalam Base64
Apabila menampal nilai base32 atau base64 tanpa padding, penyahkod boleh menerima atau menolaknya bergantung pada pelaksanaan. Kunci dan token kriptografi menunjukkan perbezaan pengekodan.
Kekunci HMAC ialah 32 bytes, yang menjadi 64 aksara hex, 52 base32 aksara (dengan padding) atau 44 base64 aksara (dengan padding). Apabila mengedarkan kunci, pengekodan hendaklah didokumenkan. Jika dokumentasi menyatakan kuncinya ialah 44 aksara asas64 tetapi anda menerima 52 aksara, ada yang tidak kena. Konvensyen boleh membimbing pembaca tetapi tidak membuktikan kesesuaian. Ringkasan cincang biasanya dipaparkan sebagai hex, manakala segmen JWT menggunakan Base64url. Pilihan yang tepat masih bergantung pada peraturan saluran, sama ada orang menyalin nilai dan sama ada protokol lain telah menetapkan perwakilan.
Perkara ini tidak meliputi — pengekodan base58, base85 dan checksummed
Pengekodan base64 yang lebih pendek menjadikannya lebih mudah untuk memuatkan token ke dalam sistem dengan had aksara (seperti kod QR atau URL). Pilihan pengekodan untuk nilai ditetapkan oleh mana-mana ekosistem asalnya. API Web sering menggunakan base64url. Dokumentasi kriptografi sering menggunakan hex. Apl pengesah menggunakan base32. Apabila membina sistem, pilih satu pengekodan, dokumenkannya dengan jelas dan kekalkan dengannya.
Mencampur pengekodan (mengatakan base64 atau base32) menimbulkan kekeliruan. Apabila menyahpepijat, langkah pertama ialah mengenal pasti pengekodan mana yang digunakan oleh nilai; alat pengekod & penyahkod Base64 boleh membantu dengan cuba menyahkodnya dalam pelbagai cara dan melihat yang mana satu menghasilkan output yang wajar. Tiada pengekodan adalah lebih baik secara universal. Base64 paling padat untuk storan mentah. Hex paling biasa kepada kriptografi dan paling boleh dibaca manusia untuk jujukan kecil. Pengekodan Base58, Base85 dan checksummed membuat pertukaran yang berbeza dan tiada dalam panel Base64 ToolAcre. Abjad, peraturan kekaburan dan jumlah semak mereka harus dinilai dengan sumber dan pelaksanaan khusus dan bukannya diekstrapolasi daripada tingkah laku yang diuji alat ini.
Bawa pulang: pilih pengekodan untuk saluran dan pembaca — cara pengekod & penyahkod Base64 meliputi kes Base64 dalam pelayar, bersama SHA kalkulator cincang dalam produk yang sama
Base32 paling tahan terhadap ralat transkripsi. Pilihan bergantung pada konteks: di mana nilai itu hidup, cara ia dikongsi, dan sistem yang akan menggunakannya.
Memahami pertukaran membantu anda memilih dengan bijak semasa mereka bentuk API atau sistem. Alat pengekod & penyahkod Base64 menunjukkan pengekodan base64; menggunakannya bersama alat hex atau base32 membolehkan anda melihat bait yang sama dalam ketiga-tiga format dan memahami perbezaan saiz dan kebolehbacaannya. Untuk kes Base64, kodkan sampel, perhatikan kiraan UTF-8-bait dan aksara keluaran yang tepat, dan uji standard berbanding URL-tanda baca selamat. Untuk kerja penghadaman, gunakan panel SHA yang berasingan. Mengekalkan operasi tersebut berbeza menghalang pilihan pengekodan daripada disalah anggap sebagai pencincangan atau perlindungan integriti.