Geliştiriciler

Base64 Kodlama Nedir? Bit Bit Nasıl Çalıştığı

7 dk okuma

Base64 kodlama, ikili (binary) veya metin verisini yalnızca 64 yazdırılabilir ASCII karakterden oluşan bir dizeye çeviren bir yöntemdir. Amacı, verinin yalnızca metni güvenli işleyebilen sistemlerden (e-posta, JSON, URL) bozulmadan geçebilmesini sağlamaktır. Şifreleme değildir, sıkıştırma da değildir; sadece verinin gösterim biçimini değiştirir.

Base64 kodlama aslında ne yapar

Base64 alfabesi A-Z, a-z, 0-9, + ve / karakterlerinden oluşur, toplam 64 sembol. Buna bir de dolgu karakteri olan = eklenir. Her 3 baytlık girdi, tam olarak 4 Base64 karakterine dönüşür. Bu yüzden çıktı, girdiden yaklaşık %33 daha büyüktür; küçülme değil büyüme söz konusudur.

64 sayısı rastgele seçilmiş değil: 6 bitlik bir grup, 2 üzeri 6 yani tam olarak 64 farklı değer alabilir. Base64 alfabesindeki 64 karakter de bu yüzden A’dan Z’ye, a’dan z’ye, 0’dan 9’a ve iki sembole (+ ve /) kadar uzanan bir liste oluşturuyor; her biri 0 ile 63 arasındaki bir sayıya karşılık geliyor.

Burada altını çizmek gereken bir nokta var: Base64 şifreleme değildir. Gizli bir anahtar kullanmaz, dönüşüm tamamen kamuya açık bir kuraldır ve herkes tarafından geri çevrilebilir. Bir parolayı Base64 ile “kodlamak” onu korumaz; sadece görünüşünü değiştirir. Bu, geliştiricilerin en sık düştüğü yanılgılardan biridir ve bir güvenlik açığı yaratabilecek kadar ciddi bir hatadır. Bir değeri gizlemek istiyorsanız gerçek şifreleme kullanmanız gerekir, Base64 bunun yerine geçmez.

Nasıl çalışır: “Man” örneğini bit bit kodlamak

Base64’ün büyüsü yok, sadece bir taban dönüşümü: 8 bitlik baytları 6 bitlik gruplara ayırıp her grubu bir Base64 karakterine eşliyor. “Man” kelimesini elle kodlayalım.

Önce her karakterin ASCII bayt değerini ve 8 bitlik ikili karşılığını bulalım:

KarakterBayt değeri8 bit ikili
M7701001101
a9701100001
n11001101110

Bu üç baytı art arda yazıp 24 bitlik tek bir dizi elde ediyoruz:

010011010110000101101110

Şimdi bu 24 biti, 6’şar bitlik dört gruba bölüyoruz:

010011 | 010110 | 000101 | 101110

Her 6 bitlik grubun ondalık karşılığı ve Base64 alfabesindeki karşılık gelen harf şöyle:

6 bit grubuOndalık değerBase64 karakteri
01001119T
01011022W
0001015F
10111046u

Sonuç: “Man” metni “TWFu” olur. Yapılan işlem tamamen mekanik bir taban dönüşümüdür, 8 bitlik baytlardan 6 bitlik parçalara geçiştir; gizli veya rastgele hiçbir şey yoktur.

Neden bazı Base64 dizeleri = ile bitiyor

6 bitlik gruplama, girdinin tam olarak 3 baytın katları olduğunda sorunsuz çalışır. Girdi 1 veya 2 bayt eksik kaldığında, Base64 eksik kalan yeri = karakteriyle doldurur. “M”, “Ma” ve “Man” örnekleriyle bunu görelim:

GirdiBayt sayısıBase64 çıktısıAçıklama
M1 baytTQ==tek bayt 3 baytlık grubu doldurmaz: 2 gerçek karakter + 2 dolgu karakteri
Ma2 baytTWE=iki bayt bir grubu doldurmaz: 3 gerçek karakter + 1 dolgu karakteri
Man3 baytTWFuüç bayt tam grubu doldurur: 4 karakter, dolgu gerekmez

Kısacası bir Base64 dizesinin sonundaki = işaretleri, orijinal verinin son grubunun 3 tam baytı doldurmadığını gösteren bir yer tutucudur. Hiçbir bilgi taşımazlar, sadece grup uzunluğunu tamamlarlar.

Base64’ü gerçekte nerede görürsün

Base64, çoğu geliştiricinin sandığından çok daha fazla yerde karşımıza çıkar:

HTTP Basic Authentication. “user:pass1234” dizesi Base64’e kodlandığında “dXNlcjpwYXNzMTIzNA==” olur ve tarayıcı bunu doğrudan Authorization: Basic dXNlcjpwYXNzMTIzNA== başlığında gönderir. Bu, Base64’ün gerçek dünyada en sık görülen kullanımlarından biridir.

JSON gövdesini bir URL veya payload içine gömmek. {"id":42,"active":true} gibi küçük bir JSON nesnesi Base64’e çevrildiğinde “eyJpZCI6NDIsImFjdGl2ZSI6dHJ1ZX0=” haline gelir; bu düz metin dizesi bir URL parametresine veya bir JWT segmentine sorunsuzca yerleştirilebilir.

CSS ve HTML içindeki data: URL’leri. Küçük görselleri ayrı bir dosya isteği yapmadan sayfaya gömmek için kullanılır, örneğin data:image/png;base64,... şeklinde.

E-posta MIME ekleri. E-posta protokolleri temelde metin tabanlı olduğundan, ikili dosya ekleri (resim, PDF) e-postaya gömülmeden önce Base64’e kodlanır.

JWT (JSON Web Token) yapısı. Bir JWT, nokta ile ayrılmış üç Base64url segmentinden oluşur: header.payload.signature. Bu araç JWT’lere özel bir çözümleme yapmaz, ama payload segmentini herhangi bir sıradan Base64 veya Base64url çözücüsüyle açabilirsiniz; aşağıdaki çözücü tam olarak bunu yapar.

Basit bir örnek daha: “Hello, World!” metni Base64’te “SGVsbG8sIFdvcmxkIQ==” olur. Unicode karakterler işin içine girdiğinde işler ilginçleşir. “café” dört harften oluşur ama é karakteri UTF-8’de 2 bayt tutar, yani toplamda 5 bayt eder ve sonuç “Y2Fmw6k=” olur; sadece harf sayısına bakarak beklediğiniz 6 karakterlik çıktı değil, 8 karakterlik bir çıktı elde edersiniz. Aynı mantık tek bir 🚀 emojisi için de geçerli: emoji UTF-8’de 4 bayt tutar ve Base64 çıktısı “8J+agA==” olur. Base64 karakter değil, bayt kodlar.

Kendi metninizi kodlayın veya çözün

Aşağıdaki iki araç tamamen tarayıcınızda çalışır, hiçbir veri sunucuya gönderilmez. Önce metninizi kodlayın, sonucu kopyalayın, sonra alttaki çözücüye yapıştırıp geri dönüşü kontrol edin.

Base64 Kodlayıcı
Ücretsiz, kayıt yok, her cihazda çalışır.
Tam aracı aç

Yaygın hatalar ve uç durumlar

Base64’ü şifreleme veya güvenlik önlemi sanmak. Bunu tekrar net söylemek gerekiyor: Base64 gizli anahtar kullanmaz ve herkes tarafından anında geri çevrilebilir. Bir parolayı veya API anahtarını “gizlemek” için Base64 kullanmak, güvenlik açısından bir kaçamak değil, gerçek bir güvenlik hatasıdır. Bu değerleri asla düz metin gibi işlem görecek şekilde Base64’e sarıp göndermeyin.

Standart Base64’ün URL-safe olmadığını unutmak. Standart alfabedeki + ve / karakterleri bir URL, sorgu dizesi veya dosya adı içinde sorun çıkarabilir; + genelde boşluk olarak yorumlanır, / ise yol ayracıyla karışabilir. Bu yüzden - ve _ karakterlerini kullanan, çoğu zaman dolgusuz bir Base64url varyantı vardır; URL’lerde, dosya adlarında ve JWT’lerde tam olarak bu yüzden kullanılır. Bir URL içinde + veya / görmeyen ama yine de Base64’e benzeyen bir dize gördüğünüzde, muhtemelen bu varyantla karşı karşıyasınızdır.

Boşluk, satır sonu veya eksik dolgu yüzünden çözmenin başarısız olması. Bazı katı Base64 çözücüler, dize içinde beklenmedik bir boşluk, satır sonu karakteri veya eksik = dolgusu bulduğunda hata verir. Bir Base64 dizesini bir yerden kopyalarken satır kaymaları oluşmadığından emin olun.

Çok baytlı UTF-8 metinlerin göz ardı edilmesi. Yukarıdaki café ve 🚀 örneklerinde gördüğümüz gibi, aksanlı harfler, CJK karakterleri veya emojiler görünürdeki karakter sayısından daha fazla bayt tutar. Base64 çıktısının uzunluğunu tahmin ederken karakter sayısını değil bayt sayısını esas alın.

Yanlışlıkla çift kodlama yapmak. Zaten Base64’e kodlanmış bir dizeyi tekrar Base64’e kodlarsanız, tek seferde çözüldüğünde okunaksız bir çıktı alırsınız; çözme işlemini bir kez daha tekrarlamanız gerekir. Bu genelde bir API entegrasyonunda veri iki farklı katmandan geçtiğinde fark edilmeden olur.

Sık sorulan sorular

Base64 kodlama tersine çevrilebilir mi? Evet, tamamen. Base64 kodlama tek yönlü bir hash veya şifreleme değildir; herhangi bir Base64 çözücü, gizli anahtara ihtiyaç duymadan orijinal veriyi geri verir.

Base64 çıktısı neden orijinal metinden daha uzun? Çünkü her 3 bayt girdi tam olarak 4 karaktere dönüşür, bu sabit bir orandır ve yaklaşık %33’lük bir büyümeye karşılık gelir. Bu, verinin sıkıştırılmadığının, tam tersine biraz şişirildiğinin bir kanıtıdır.

JWT token’ını bu araçla çözebilir miyim? JWT’nin header ve payload segmentleri Base64url ile kodlanmıştır, bu yüzden payload kısmını (noktalarla ayrılmış ikinci parça) kopyalayıp yukarıdaki çözücüye yapıştırdığınızda içindeki JSON verisini okuyabilirsiniz. İmza segmenti (üçüncü parça) doğrulama için ayrı bir kriptografik işlem gerektirir, bu araç onu doğrulamaz.

Base64 kodlanmış bir dizede neden bazen + ve / yerine - ve _ görüyorum? Çünkü URL, dosya adı veya JWT bağlamında kullanılan Base64url varyantı bu iki sembolü standart alfabedeki + ve / yerine kullanır, çoğunlukla da = dolgusunu tamamen atlar. Amaç, dizenin bir URL içinde sorunsuzca taşınabilmesidir.

café gibi aksanlı bir kelime neden düşündüğümden daha uzun bir Base64 çıktısı veriyor? Çünkü Base64 karakterleri değil baytları kodlar. café dört karakterden oluşur ama é UTF-8’de 2 bayt tutar, toplamda 5 bayt eder; bu da 6 değil 8 karakterlik bir Base64 çıktısı (“Y2Fmw6k=”) anlamına gelir.

Base64KodlamaJWTGeliştirici Araçları
Base64 Kodlayıcı
Şimdi tam araçla kendin dene.
Şimdi dene
İlgili araçlar