Alat pembangun · Pengekod & penyahkod Base64
Cara HTTP pengepala pengesahan asas dibina dan dinyahkodkan dengan Base64
· Bagaimana ia berfungsi
asas64 keselamatan
Pengepala Kebenaran: Asas hanyalah nama pengguna:kata laluan yang dijalankan melalui Base64. Siaran ini menunjukkan cara nilai dibina, cara menyahkod satu daripada log permintaan dan sebab pengekodan tidak menyembunyikan apa-apa.
401 yang berterusan walaupun bukti kelayakan adalah betul — nilai pengepala yang menyahkod kepada rentetan yang salah secara halus
HTTP API mengembalikan 401 Tanpa kebenaran dan mengharapkan Pengepala Kebenaran: Asas. Nilainya ialah perkataan skema Asas, satu ruang dan rentetan Base64. Awalan yang tiada, awalan yang dikodkan atau baris baharu yang tidak disedari mengubah perkara yang diterima oleh pelayan walaupun nama pengguna dan kata laluan yang kelihatan kelihatan betul.
Nyahkod rentetan itu dan ia membaca nama pengguna:kata laluan (secara literal bertindih antara dua). Nama pengguna bait:kata laluan ialah UTF-8 dikodkan kemudian Base64 dikodkan, menghasilkan nilai pengepala. Jika kelayakan adalah admin:s3cret, UTF-8 bait ialah 0x61 0x64 0x6D 0x69 0x6E 0x3A 0x73 0x33 0x63 0x72 0x65 0x74 (ASCII huruf tambah titik bertindih), pengekodan Base64 menghasilkan YWRtaW46czNjcmV0, dan pengepala ialah Kebenaran: YWRtaW46czNjcmV0 Asas.
Resipi daripada RFC 7617: 'user:pass', UTF-8, Base64 — langkah tepat dan peranan kolon
Ini lengkap HTTP Skim pengesahan asas yang ditakrifkan dalam RFC 7617. Ia mudah, diseragamkan dan tidak menawarkan keselamatan dengan sendirinya: sesiapa sahaja yang membaca pengepala boleh segera menyahkodnya untuk membaca kata laluan. Itulah sebabnya HTTPS diwajibkan untuk pengesahan Asas. Pengekodan ialah keperluan pengangkutan, bukan ciri keselamatan. Kata laluan bergerak sebagai UTF-8 bait, sama seperti mana-mana data lain; Base64 hanyalah notasi yang digunakan dalam protokol HTTP.
Jika perlu menyahkod pengepala Asas daripada log rangkaian, proses adalah mudah: jalurkan Asas, baki nyahkod Base64 dan anda mempunyai nama pengguna:kata laluan. Titik bertitik ialah pembatas antara nama pengguna dan kata laluan. RFC 7617 menentukan kelayakan ialah user-id : kata laluan, dan titik bertindih pertama ialah pemisah. Jika kata laluan mengandungi titik bertindih, bertindih kedua hanyalah satu lagi aksara dalam kata laluan. Kolon adalah berstruktur kerana penerima memerlukan satu sempadan yang tidak jelas. Ia mencari kolon pertama selepas penyahkodan; segala-galanya sebelum ia mengenal pasti pengguna dan segala-galanya selepas ia adalah kata laluan. Oleh itu, kolon yang hilang menunjukkan pasangan bukti kelayakan yang cacat, bukan masalah abjad Base64.
Contoh berfungsi: pengekodan admin:s3cret dan menyahkod pengepala daripada log — kedua-dua arah, termasuk pepijat baris baharu yang mengekori
Jika nama pengguna ialah pentadbir dan kata laluan ialah pass:word, kelayakan ialah admin:pass:word, yang dikodkan kepada YWRtaW46cGFzczp3b3Jk. Apabila menyahkodnya, mesti berpecah pada titik bertindih pertama sahaja, memberikan nama pengguna admin dan kata laluan pass:word. Pemisahan pada setiap titik bertindih akan membahagi kata laluan secara salah. Parameter charset dalam RFC 7617 menyatakan bukti kelayakan UTF-8 dikodkan. Ini bermakna bukan ASCII aksara dalam nama pengguna atau kata laluan ditukar kepada UTF-8 bait sebelum pengekodan Base64.
Jika nama pengguna ialah kafe (beraksen e), UTF-8 bait ialah 0x63 0x61 0x66 0xC3 0xA9 (empat bait untuk ASCII huruf tambah dua untuk aksara beraksen), dan bukti kelayakan penuh café:kata laluan mempunyai bait oleh, kemudian kata laluan kafe0x3. Output Base64 mengekod semua bait dengan setia. Penyahkod mesti tahu untuk mentafsir bait yang dinyahkodkan sebagai teks UTF-8, bukan Latin-1.
Kata laluan yang mengandungi titik bertindih, ruang dan bukan ASCII — sebab titik bertindih pertama berpecah dan untuk tujuan parameter charset
Contoh yang berjaya: mulakan dengan admin:s3cret. Tukar kepada UTF-8 bait: a=0x61, d=0x64, m=0x6D, i=0x69, n=0x6E, :=0x3A, s=0x73, 3=0x33, c=0x63, r=0x72, e=0x65, t=0x74. Dalam perpuluhan: (97, 100, 109, 105, 110, 58, 115, 51, 99, 114, 101, 116). Base64 mengekod ini 12 bytes: kumpulan kepada empat kumpulan tiga (hasilkan empat kumpulan empat aksara Base64).
Nilai yang dikodkan ialah YWRtaW46czNjcmV0. Pengepala kebenaran ialah Kebenaran: YWRtaW46czNjcmV0 Asas. Bahagian kata laluan boleh mengandungi kolon lain tanpa mengalihkan sempadan pertama itu. Ruang dan teks bukan ASCII juga kekal apabila kedua-dua rakan sebaya bersetuju dengan pengekodan teks. ToolAcre boleh mengesahkan UTF-8 bait yang dipancarkannya, tetapi pelayan lama yang menjangkakan set aksara yang berbeza kekal sebagai isu kebolehoperasian di luar transformasi Base64.
Mengapa ini tidak selamat tanpa TLS — penyahkodan menunjukkan kata laluan kepada sesiapa sahaja yang melihat pengepala
Untuk menyahkod pengepala yang diterima, tanggalkan Basic, Base64 nyahkod YWRtaW46czNjcmV0 untuk mendapatkan kembali bait, tafsirkan sebagai UTF-8 teks untuk mendapatkan admin:s3cret, pisahkan pada kolon pertama untuk mengekstrak nama pengguna dan kata laluan. Kesilapan biasa ialah mengekori baris baharu daripada gema. Jika jalankan echo admin:s3cret | base64 dalam shell Unix, echo menambah baris baharu secara lalai, jadi kodkan admin:s3cret dengan baris baharu (13 bytes sebaliknya 12).
Output Base64 adalah berbeza: YWRtaW46czNjcmV0Cg== (lapik dan aksara tambahan). Pengepala kebenaran dengan nilai ini akan gagal kerana kata laluan termasuk aksara baris baharu. Betulkan ialah gunakan gema -n atau paip melalui printf atau alat yang tidak menambahkan baris baharu. Pengekod & penyahkod Base64 mengelakkan perkara ini: mengekod dengan tepat apa yang anda tampal, tiada baris baharu tersembunyi. TLS menukar ancaman pengangkutan, bukan format kelayakan. Di dalam sambungan yang dilindungi, pengepala disulitkan dengan permintaan yang lain; sebaik sahaja perisian mencatat atau memaparkannya, nilai Base64 sekali lagi mendedahkan kelayakan boleh guna semula kepada sesiapa sahaja yang boleh menyahkodnya. Redaksi masih penting di setiap titik pemerhatian.
Kesilapan biasa — baris baharu daripada gema, awalan 'Asas' yang tiada dan pengekodan dua nilai
Ralat lain tiada awalan Asas. Nilai pengepala kebenaran tidak sah Base64 sahaja; ia adalah nama skema (Asas atau Pembawa atau lain-lain) diikuti dengan ruang dan kemudian kelayakan. Sesetengah sistem gagal mengiktiraf YWRtaW46czNjcmV0 sebagai kelayakan tetapi berjaya dengan Asas YWRtaW46czNjcmV0. Jika menyahpepijat 401, semak sama ada pelayan menghuraikan pengepala Kebenaran dengan betul.
Skim tidak peka huruf besar-kecil dalam standard HTTP tetapi banyak pelaksanaan adalah sensitif huruf besar-besaran; semak dokumentasi API. Pengekodan dua kali ialah satu lagi mod kegagalan. Jika rentetan pengekodan Base64 yang sudah dikodkan Base64, output adalah rentetan yang berbeza. Pengekodan YWRtaW46czNjcmV0 menghasilkan WVdkbWFXNDZjek5qY3JldA== (berbeza sepenuhnya). Sesetengah sistem mungkin menggunakan pengekodan dua kali secara tidak sengaja: sekali semasa persediaan bukti kelayakan dan sekali lagi semasa membina pengepala. Baris baharu daripada arahan shell amat mudah dilepaskan kerana ia boleh dikodkan sebagai sebahagian daripada bukti kelayakan dan bukannya ditolak sebagai ruang kosong di sekitar Base64. Pengepala yang terhasil menyahkod dengan bersih kepada kata laluan dengan bait tambahan, menghasilkan 401 yang kelihatan seperti kegagalan pengesahan bahagian pelayan.
Perkara ini tidak meliputi — Skim Digest dan Pembawa, dan gesaan kelayakan pelayar
Penyahkod menjangkakan satu lapisan Base64, jadi pengekodan dua kali menyebabkan ketidakpadanan. Inilah sebabnya mengapa log masuk nilai kelayakan dalam bentuk Base64 (bukan plaintext) boleh mengelirukan: jika seseorang menggunakan penyahkodan sekali, mereka melihat nama pengguna dan kata laluan; jika digunakan dua kali, mereka melihat kekeliruan. Pengesahan ringkasan (RFC 7616) dan pengesahan Pembawa (untuk token OAuth) menggunakan skema yang berbeza, setiap satu dengan format bukti kelayakan yang berbeza.
Digest memerlukan pelayan untuk menghantar nonce, klien untuk mengira cincang, dan pengepala untuk memasukkan cincang tambah nama pengguna, bukan kata laluan. Pembawa biasanya JSON Token Web (JWT), yang dikodkan Base64url tetapi tidak diawali dengan nama pengguna. Pengesahan asas adalah lebih mudah daripada kedua-duanya tetapi tidak selamat sepenuhnya tanpa TLS kerana bukti kelayakan boleh dibaca dalam pengepala. Digest dan Pembawa menggunakan medan pengepala Kebenaran yang sama tetapi memberikan makna yang sama sekali berbeza kepada nilainya. Gesaan kelayakan pelayar menambah antara muka pengguna dan gelagat caching di atas Asas. Artikel ini berhenti pada membina dan memeriksa muatan kelayakan Asas dan bukannya membandingkan sistem pengesahan tersebut.
Bawa pulang: Pengesahan asas ialah Base64, bukan perlindungan — cara pengekod & penyahkod Base64 membolehkan anda menyemak nilai pengepala secara setempat tanpa menghantar bukti kelayakan ke mana-mana
Jika API menyokong berbilang skim pengesahan, pilih paling selamat yang tersedia. Pengekod & penyahkod Base64 boleh membantu nyahpepijat Kegagalan pengesahan asas: tampal rentetan kelayakan (nama pengguna dan titik bertindih dan kata laluan), dan alat menghasilkan nilai Base64 serta-merta. Bandingkan hasil dengan penghantaran pengepala dan ketidakpadanan kelihatan. Sebaliknya, tampal nilai pengepala daripada log rangkaian, jalur awalan Asas, nyahkod untuk melihat apa yang dilihat pelayan.
Untuk pembelajaran, tampal admin:s3cret dan amati output, kemudian ubah suai kata laluan untuk melihat bagaimana Base64 berubah. Memahami cara pengepala dibina menjelaskan sebab penyahkodan memerlukan mengetahui format RFC dan sebab kolon ialah elemen struktur, bukan Base64. Semakan tempatan harus menggunakan bukti kelayakan yang dicipta, bukan kata laluan langsung yang disalin daripada pengeluaran. Kodkan pasangan, gerakkan kembali output ke panel input dan nyahkodkannya. Tanda baca yang sepadan dan aksara mengekori yang tepat membuktikan perwakilan perjalanan pergi balik sebelum pengepala dihantar ke mana-mana sahaja.