Mengapa hasil decode base64 saya tampak seperti sampah?
Anda men-decode sesuatu dan mendapat deretan karakter tanpa makna, tanda tanya, atau simbol pengganti. Ada dua sebab yang cukup berbeda untuk itu, dan keduanya menuntut tanggapan yang berlawanan, jadi ada gunanya tahu yang mana yang Anda hadapi.
Yang pertama, masukan Anda memang tidak pernah berupa base64. Alfabet base64 adalah huruf, angka, plus, dan garis miring — artinya banyak sekali teks biasa lolos sebagai base64 yang sah hanya dari bentuknya. Sebuah digest heksadesimal, UUID tanpa tanda hubung, hash commit git, dan kata Inggris sederhana seperti "test" atau "Password" lolos pemeriksaan karakter mana pun. Men-decode-nya adalah operasi yang sah dan menghasilkan byte yang tidak pernah berupa teks, sehingga hasilnya derau. Decoder tidak gagal: ia menjawab pertanyaan yang tidak Anda maksudkan.
Yang kedua, masukannya memang base64 dan muatannya sekadar bukan teks. Base64 ada untuk membawa byte sembarang melalui saluran yang hanya menerima karakter, dan byte itu sering kali berupa gambar, arsip terkompresi, sertifikat, pesan protobuf, atau blok terenkripsi. Decode-nya bekerja sempurna. Yang keluar memang tidak pernah dimaksudkan untuk dibaca sebagai huruf.
Biasanya keduanya bisa dibedakan dari byte-byte pertama hasilnya. PNG dimulai dengan huruf PNG setelah satu byte yang tidak dapat dicetak; aliran gzip dimulai dengan dua byte tetap; PDF membawa penanda yang terlihat di awal; sertifikat dalam bentuk DER dimulai dengan byte struktur, bukan sesuatu yang terbaca. Jika keluaran dimulai dengan tanda tangan yang dikenali, Anda memegang data sungguhan dalam suatu format, bukan decode yang gagal.
Pemeriksaan lainnya adalah keterbalikan. Encode ulang hasilnya dan bandingkan dengan yang Anda mulai. Base64 asli kembali persis sama. Nilai yang hanya berbentuk base64 biasanya tidak, karena panjang atau padding-nya tidak pernah berasal dari sebuah encoder.
Ini paling penting bagi alat yang men-decode berulang kali. Alat yang terus mengupas selama masukan masih tampak bisa di-decode akhirnya akan merusak nilai yang sebenarnya baik dengan men-decode-nya sekali terlalu banyak, lalu melaporkan jumlah lapisan yang memuat lapisan yang tidak pernah ada. Berhenti di titik yang tepat, dan mengatakan alasannya, adalah bagian yang benar-benar sulit.