Kodlayıcı / Çözücü rehberi
Base64, URL kodlaması ve HTML varlıkları ne işe yarar, XGM Kodlayıcı / Çözücü metni nasıl dönüştürür ve kodlama neden şifreleme değildir.
Base64 ne yapar
Base64 (RFC 4648) baytları üçerli gruplar halinde alır, 24 biti dört adet 6 bitlik gruba böler ve her grubu 64 karakterden birine eşler: A–Z, a–z, 0–9, + ve /. Girdinin uzunluğu üçün katı değilse son grubu = dolgusu tamamlar. Çıktı girdiden yaklaşık %33 daha büyüktür, ama yalnızca metin için tasarlanmış sistemlerden sağ çıkan karakterler içerir. Bu boyut artışı, güvenli taşımanın bedelidir: çıktıda denetim karakteri ya da sekizinci biti kırpan eski sistemleri şaşırtacak bir bayt kalmaz.
Yaygın kullanım alanları arasında e-posta ekleri (MIME), HTML ya da CSS içine küçük görseller gömen data URI'ler, JSON'daki ikili alanlar, HTTP Basic kimlik doğrulama başlıkları ve JSON Web Token'ların bölümleri vardır. Bu kanalların ortak yanı, ham baytları güvenle iletememeleridir; araya giren bir sunucu metni yeniden kodlayabilir, satır sonlarını değiştirebilir ya da ASCII dışı baytları bozabilir. Base64 bu riski ortadan kaldırır, çünkü çıktısı her sistemde aynı anlama gelen dar bir karakter kümesinden oluşur. Hepsinde amaç taşımadır, gizlilik değil.
Kodlayıcıda Base64 nasıl kullanılır
- Kodlayıcı / Çözücü aracını açın.
- Metni Base64'e çevirmek için Kodla, Base64'ü metne çevirmek için Çöz seçeneğini seçin.
- Base64url için “URL güvenli alfabe” kutusunu işaretleyin; bu alfabe
-ve_kullanır ve dolguyu atlar. - Girdinizi yapıştırın; sonuç tarayıcınızda güncellenir ve kopyalanabilir.
Metin UTF-8 olarak kodlanır; bu yüzden ş, ü gibi karakterler ya da emojiler doğru şekilde işlenir. Çözme işlemi geçerli UTF-8 metni olmayan baytlar ürettiğinde, örneğin bir görsel ya da sıkıştırılmış veri söz konusuysa, araç okunamayan karakterler göstermek yerine içeriği ikili olarak bildirir. Seçtiğiniz mod adres çubuğunda ?mode=base64 olarak tutulur, bu yüzden doğrudan bu moda açılan bir bağlantıyı paylaşabilirsiniz; girdiniz ise hiçbir zaman URL'ye yazılmaz.
URL kodlaması, HTML varlıkları ve sayı tabanları
Kodlayıcı / Çözücü aracında Base64'ün yanında üç mod daha vardır. URL modu metni yüzde kodlamasından geçirir: tek bir sorgu değeri ya da yol parçası (encodeURIComponent, ki bu &, = ve / karakterlerini de kaçırır) veya bütün bir URL (encodeURI, ki bu adresi kuran karakterleri olduğu gibi bırakır) seçebilirsiniz. Doğru seçeneği belirlemek önemlidir: tam bir adresi encodeURIComponent ile kaçırırsanız : ve / karakterleri de kodlanır ve bağlantı kullanılamaz hale gelir. Çözme sırasında + işareti boşluk olarak ele alınabilir, çünkü HTML formları boşluğu böyle gönderir.
HTML varlıkları modu, HTML yapısını değiştiren beş karakteri (<, >, &, " ve ') kaçırır, istenirse ASCII dışı her karakteri de kaçırır ve adlandırılmış ile sayısal referansları çözer. Sayı tabanı modu ise her boyuttaki tam sayıyı ikilik, sekizlik, onluk, onaltılık ve 36 tabanı arasında yuvarlama yapmadan dönüştürür ve 0x, 0o ile 0b öneklerini kabul eder. Bu mod BigInt kullandığı için 64 bite sığmayan değerler bile tam olarak dönüşür; bu da bayrak maskeleri, izin bitleri ve büyük kimlik numaralarıyla çalışırken işe yarar.
| İş | Mod |
|---|---|
| JSON, e-posta ya da data URI içindeki ikili veri | Base64 |
| Sorgu dizesindeki bir değer | URL, sorgu değeri |
| Kullanıcı metnini HTML içinde göstermek | HTML varlıkları |
| Onaltılık dökümü ya da bit maskesini okumak | Sayı tabanı |
Standart Base64 ve Base64url
| Çeşit | 62 ve 63 numaralı karakterler | Dolgu | Kullanıldığı yerler |
|---|---|---|---|
| Base64 | + ve / | = zorunlu | MIME e-posta, data URI'ler, çoğu API |
| Base64url | - ve _ | Genellikle atlanır | JWT'ler, URL'ler, dosya adları, WebAuthn |
+ ve / karakterlerinin URL'lerde, = işaretinin ise sorgu dizelerinde özel anlamları vardır; bu yüzden bir URL içindeki standart Base64'ün ayrıca yüzde kodlamasından geçmesi gerekir. Base64url bu zahmeti ortadan kaldırır. Bir çeşit için yazılmış çözücüler genellikle diğerini reddeder; bir JWT bölümü standart bir çözücüye yapıştırıldığında sık sık “geçersiz Base64” hatası alınmasının nedeni budur. Aynı karışıklık ters yönde de görülür: URL güvenli bir değeri standart alfabeye çeviren bir kütüphane, dolgu eklemeyi unutursa uzunluk hatası verir.
Standard: +/+/Pz8=
URL-safe: -_-_Pz8Base64 şifreleme değildir
Base64 hiçbir şeyi gizlemez. YWRtaW46c2VjcmV0 değerini gören herkes bunu bir saniyede admin:secret olarak çözebilir; bir HTTP Basic kimlik doğrulama başlığının içeriği tam olarak budur. Parolaları Base64 ile “kodlanmış” biçimde tutan yapılandırma dosyaları ve günlükler, pratikte onları düz metin olarak saklıyor demektir. Bir sırrı gerçekten korumak için bir anahtar gerekir; kodlamada anahtar yoktur, yalnızca herkesin bildiği bir alfabe vardır.
Kodlanmış sırlar hâlâ sırdır
Authorization: Basic YWRtaW46c2VjcmV0
# decodes to admin:secret; only TLS protects it in transitBase64 ile nerede karşılaşırsınız
| Yer | Nasıl görünür | Çeşit |
|---|---|---|
| E-posta ekleri | Content-Transfer-Encoding: base64 altında 76 karakterlik satır blokları | Standart, satırlara bölünmüş |
| Data URI'ler | data:image/png;base64,iVBORw0KGgo… | Standart |
| JSON Web Token'lar | eyJ ile başlayan, noktayla ayrılmış üç bölüm | Base64url |
| HTTP Basic kimlik doğrulama | Authorization: Basic … | Standart |
| Kubernetes secret'ları | Secret manifestlerindeki data: alanlarının değerleri | Standart |
| DKIM anahtarları ve sertifikalar | DKIM kayıtlarındaki p= değeri, PEM blokları | Standart |
| Subresource Integrity | integrity="sha384-…" | Standart |
eyJ öneki kullanışlı bir ipucudur: bu önek {" ifadesinin Base64 karşılığıdır, dolayısıyla bununla başlayan dizeler genellikle kodlanmış JSON, çoğu zaman da bir JWT olur. Benzer şekilde PEM dosyaları -----BEGIN ve -----END satırları arasındaki Base64'ten oluşur, data URI'ler ise yükten önce her zaman ;base64, içerir. Bu küçük işaretler, elinizdeki dizenin hangi çeşide ait olduğunu daha çözmeden tahmin etmenizi sağlar ve gereksiz deneme yanılmayı önler.
Kubernetes secret'ları, Base64'ün koruma sanılmasının en bilinen örneğidir. Bir Secret manifestindeki değerler yalnızca kodlanmıştır; manifesti okuyabilen herkes sırrı da okuyabilir. Onları asıl koruyan şey, diskte şifreleme ve küme üzerindeki erişim denetimidir. Aynı yanılgı, ortam değişkenlerini ya da yapılandırma yedeklerini Base64'e çevirip güvenli saymakta da tekrarlanır.
Komut satırında ve kodda Base64
# Linux / macOS
printf '%s' 'Hello' | base64 # SGVsbG8=
printf '%s' 'SGVsbG8=' | base64 --decode
# JavaScript (UTF-8 safe)
btoa(String.fromCharCode(...new TextEncoder().encode('Grüße')))
# Python
python3 -c "import base64; print(base64.urlsafe_b64encode(b'Hello').decode())"Çoğu dil Base64'ü standart kütüphanesinde sunar; bu yüzden onu kendiniz yazmanız için nadiren bir neden vardır. Bir fonksiyonun hangi çeşidi ürettiğine dikkat edin: birçok kütüphanede standart ve URL güvenli Base64 için ayrı fonksiyonlar bulunur, bazıları da dolguyu farklı ekler ya da kaldırır. İki sistem bir değer üzerinde anlaşamıyorsa önce çeşidi ve dolguyu karşılaştırın. Bunun en hızlı yolu, aynı girdiyi her iki tarafta kodlayıp çıktıları karakter karakter yan yana koymaktır.
Tarayıcıdaki btoa yalnızca Latin-1 dizelerle çalışır ve başka karakterlerde hata fırlatır; örnekte metnin önce UTF-8 baytlarına çevrilmesinin nedeni budur. Satır sonları da ayrı bir tuzaktır: bazı araçlar MIME'ın gerektirdiği gibi Base64 çıktısını 76 karakterde satırlara böler, bazı çözücüler ise bu satır sonlarını kabul etmez. Kendi kodunuzda dizeyi çözmeden önce boşlukları ve satır sonlarını temizlemek, bu iki dünyayı uzlaştırmanın en basit yoludur.
Çözme hatalarını gidermek
| Belirti | Neden | Çözüm |
|---|---|---|
| Geçersiz karakter | Standart bir çözücüye verilen Base64url girdisi ya da araya karışmış boşluklar | URL güvenli seçeneğini işaretleyin ya da - ve _ karakterlerini + ve / ile değiştirin |
| Geçersiz uzunluk | Dolgu kaldırılmış | Uzunluk 4'ün katı olana kadar = ekleyin ya da URL güvenli modu kullanın |
| Okunamayan çıktı | Veri ikili (görsel, sıkıştırılmış, şifrelenmiş) | Baytları metin olarak okumak yerine bir dosyaya kaydedin |
| Şapkalı harfler yanlış çıkıyor | Metin başka bir karakter kümesiyle kodlanmış | Özgün kodlamayla çözün ya da UTF-8 olarak yeniden kodlayın |
| Başta fazladan karakterler | data:image/png;base64, gibi bir data URI öneki | Virgüle kadar olan her şeyi, virgül dâhil, kaldırın |
JWT'ler için bunun yerine JWT Çözücü aracını kullanın; bu araç token'ı bölümlerine ayırır ve her bölümü Base64url olarak çözer. URL'lerdeki değerler için URL Kodlayıcı aracı, https://www.example.com/?token= adresindeki bir sorgu dizesinden + işareti geçtiğinde ortaya çıkan %2B gibi yüzde kodlamalarını halleder. İkisini birlikte kullanmak, bir token'ın taşıma sırasında mı yoksa içeriğinde mi bozulduğunu ayırt etmenizi sağlar.
SSS
Base64 bir şifreleme midir?
Hayır. Anahtarsız, geri döndürülebilir bir kodlamadır. Herkes çözebilir.
Base64 çıktısı neden girdiden uzun?
Her 3 bayt 4 karaktere dönüşür; bu yüzden boyut yaklaşık üçte bir artar, üstüne bir de dolgu eklenir.
Sondaki = işaretleri nedir?
Uzunluğu 4'ün katı yapan dolgudur. Tek bir = son grubun iki bayt olduğunu, == ise bir bayt olduğunu gösterir.
Base64url nedir?
+ ve / yerine - ve _ kullanan, dolguyu genellikle atlayan bir çeşittir; böylece değerler kaçırmaya gerek kalmadan URL'lerde ve dosya adlarında kullanılabilir.
Araç emojileri ve şapkalı harfleri destekliyor mu?
Evet. Metin Base64'ten önce UTF-8 olarak kodlanır, çözme sırasında da UTF-8 olarak geri okunur.
Girdim bir yere yükleniyor mu?
Hayır. Kodlama ve çözme tarayıcınızda gerçekleşir.
Bir görseli çözebilir miyim?
Araç metin sonuçları gösterir. İkiliye çözülen Base64 ikili olarak bildirilir; böyle bir veriyi görmek için komut satırı aracıyla bir dosyaya kaydedin.
Çözülen metnimde neden tuhaf karakterler var?
Özgün metin büyük ihtimalle farklı bir karakter kodlamasındaydı ya da veri ikili. Nasıl üretildiğini kontrol edin.
Base32 ya da onaltılık, Base64'ten daha mı iyi?
Boyutu okunabilirlikle takas ederler. Onaltılık boyutu iki katına çıkarır ama basittir ve büyük küçük harf ayrımı yoktur; Base32 karıştırılabilen karakterlerden ve harf boyu sorunlarından kaçınır; Base64 ise üçünün en derli toplusudur.
Bazı Base64 dizelerinde neden satır sonları var?
MIME e-postası Base64'ü satır başına 76 karakterde böler. Tek satır bekleyen araçlarla çözmeden önce satır sonlarını kaldırın.
Görselleri Base64 data URI olarak gömmeli miyim?
Yalnızca çok küçük olanları. Base64 boyutu üçte bir artırır ve ayrı önbelleklemeyi engeller; küçük bir simgeden büyük her şey için normal görsel dosyaları daha iyidir.