Skip to content

Guide

Base64 Kodlama Açıklaması: Neden, Ne Zaman ve Yaygın Varyantlar

64 karakterlik alfabe, %33 boyut cezası ve birbirini bozan üç neredeyse özdeş varyant.

By Published

Base64 her yerdedir — e-posta ekleri, JWT token'ları, veri URI'leri, sertifika PEM blokları, OAuth istemci sırları, push bildirim yükleri — ve neredeyse kimse ne yaptığını sormuyor. Tek bir iş yapar, neredeyse özdeş üç varyantı vardır ve aralarındaki farklar hataların büyük çoğunluğuna neden olur.

Base64'ün çözdüğü sorun

Birçok taşıma kanalı rastgele baytlar değil metin için tasarlanmıştır. E-posta gövdeleri tarihsel olarak yazdırılabilir ASCII olmak zorundaydı. URL'ler ham kontrol karakterleri veya boşluk içeremez. JSON dizeleri geçerli Unicode olmak zorundadır. Bu kanalların herhangi birine PNG göndermek istediğinizde ham baytlar kanalı bozar.

Base64, herhangi bir bayt dizisini yalnızca 64 güvenli karakter ve isteğe bağlı dolgu kullanarak yeniden ifade eder. Sonuç, metnin sığdığı her yere sığar ve bir dekoder orijinal baytları tam olarak geri alır. Kayıp yok, sıkıştırma yok, güvenlik yok — yalnızca bir format değişikliği.

Alfabe

Standart Base64 (RFC 4648 §4) toplamda 65 karakter kullanır:

  • A–Z — 0–25 değerleri
  • a–z — 26–51 değerleri
  • 0–9 — 52–61 değerleri
  • + — 62 değeri
  • / — 63 değeri
  • = — dolgu, değer yok

Her karakter 6 bit taşır (26 = 64). Üç giriş baytı (24 bit) dört çıktı karakterine (24 bit) eşlenir. Giriş 3'ün katı bayt olmadığında, kodlayıcı sağdan sıfır doldurur ve her dolgu adımı için = yayar.

Çıktı neden %33 daha büyük?

4 çıktı karakteri yalnızca 3 giriş baytının taşıdığı kadar bilgi taşır; dolayısıyla şişme tam olarak 4/3 = 1,333…, yani %33,3 ekstra. Kısa girişler için dolgu biraz daha ekler. 1 MB ikili dosya 1,33 MB Base64 dizisine dönüşür.

Örnek girişle Base64 şifreleyici / çözücümüzü deneyin — boyut oranı sonucun yanında raporlanır.

Karşılaşacağınız üç varyant

Standart Base64 (RFC 4648 §4)

Orijinal. Alfabe + ve / içerir, = ile dolgu zorunludur. PEM dosyaları (TLS sertifikaları, SSH anahtarları), XML İmzası, SOAP ekleri ve Authorization: Basic HTTP başlığı tarafından kullanılır.

Base64url (RFC 4648 §5)

URL ve dosya adı güvenli. + yerine -, / yerine _ kullanır. Dolgu spesifikasyonda teknik olarak isteğe bağlıdır ancak pratikte neredeyse her zaman çıkarılır. JWT, JWS, JWE, OAuth PKCE, WebPush VAPID ve WebAuthn tarafından kullanılan budur.

Standart ve URL güvenli Base64 doğrudan birbirinin yerine kullanılamaz. Bir alfabe bilen bir dekoder diğerinin girdisini reddeder. Sınırda karakter sınıfı değiştirme yaparak normalleştirin. Base64 vs Base64url karşılaştırmamıza bakın.

MIME Base64 (RFC 2045)

Orijinal e-posta eki varyantı. Standart Base64 ile aynı alfabe, ancak eski SMTP aktarıcıları uzun satırlarda takıldığı için her 76 karakterde bir sabit satır sonu (\r\n) eklenir. MIME Base64 içindeki boşluklar dekoder tarafından görmezden gelinmelidir. Çoğu modern dekoder herhangi bir Base64 girdisinde boşluğu sessizce kabul eder. JSON alanı veya JWT için Base64 oluşturuyorsanız hiçbir zaman satır sonu eklemeyın.

Base64 pratikte nerede görünür

  • JWT token'ları — nokta ile ayrılmış üç base64url (dolgusuz) bölüm. Başlık. Yük. İmza.
  • HTTP Temel kimlik doğrulamaAuthorization başlığında gönderilen kullanıcı:şifre standart Base64 kodlu. (TLS olmadan neden "Basic" bir güvenlik mekanizması değildir.)
  • Veri URI'leridata:image/png;base64,iVBORw0KG… ikiliyi HTML veya CSS'e gömer.
  • PEM dosyaları — TLS sertifikaları, SSH anahtarları, PGP mesajları. -----BEGIN…----- / -----END…----- başlıklarına sarılmış standart Base64.
  • E-posta ekleri — 76 karakterlik satır sarmalı ile MIME Base64.
  • Kubernetes Secret'ları — şifrelenmiş değil standart Base64 kodlu değerler (bu, insanları şifrelenmiş sandığı için meşhurca yanıltıcıdır).

Yaygın tuzaklar

UTF-8 belirtmeden dizeleri kodlamak

Base64 karakterleri değil, baytları kodlar. "café" dizesini Base64 ile kodlarsanız sonuç tamamen hangi bayt kodlamasını seçtiğinize bağlıdır (UTF-8 5 bayt verir → Y2Fmw6k=; Latin-1 4 bayt verir → Y2Fm6Q==). Farklı bir varsayımla çözme anlamsız sonuç üretir. Modern kural, metin girişi için UTF-8 bayttır.

Standart ve URL güvenliyi karıştırmak

- veya _ içeren dize base64url'dir; standart Base64 dekoderler reddeder. + veya / içeren dize standarttır; URL güvenli dekoderler reddeder. Her iki ucu da kontrol ediyorsanız birini seçin ve belgeleyin. Kontrol etmiyorsanız karakter sınıfı değiştirme yaparak girdide normalleştirin.

Dolgu uyuşmazlığı

JWT ve benzeri formatlar dolguyu çıkarır. Naif dekoderler dolgu gerektirir ve InvalidBase64 fırlatır. Düzeltme, giriş uzunluğu 4'ün katı olana kadar = karakterleri yeniden eklemektir — genellikle bir veya iki tane.

Base64'ü güvenlik sınırı olarak kabul etmek

Kubernetes Secret'ları Base64'tür, şifreli değil. İstemci kodundaki bir parolayı Base64 ile kodlamak onu korumaz. Base64 bir dekoderi olan herkesten hiçbir şeyi gizlemez — ve her dizüstü bilgisayarda bir dekoder vardır.

Şifreleyiciyi deneyin

Herhangi bir metni yapıştırın veya Base64 şifreleyici / çözücümüze dosya yükleyin. Hem standart hem de URL güvenli alfabeleri destekler, dolgu davranışını açıkça gösterir ve belirli girişiniz için şişmeyi görebilmeniz amacıyla giriş/çıktı bayt boyutlarını raporlar. Base64 sözlük girdisi tek paragraflık versiyondur.

Sonuç

Base64 bir taşıma kolaylığıdır, güvenlik özelliği değil. Baytlarınızın üçte birini size mal eder ve yalnızca metin kanallarıyla uyumluluk karşılığında bunu öder. Varyantlar önemlidir — PEM ve HTTP Temel için standart, JWT ve OAuth için URL güvenli, e-posta için MIME — ve birbirlerini dönüştürme yapmadan çözemezler. Hangi varyantı ürettiğinizi ve tükettiğinizi her zaman açıkça belirtin ve Unicode dizelerini önce UTF-8 bayta dönüştürün.

Frequently asked questions

Base64 şifreleme midir?
Hayır. Base64 kodlamadır, şifreleme değil — anahtar yoktur ve herkes anında tersine çevirebilir. Yalnızca metin tabanlı kanallar aracılığıyla ikili verilerin güvenli şekilde taşınması için mevcuttur. Base64'ü güvenlik önlemi olarak kabul etmek bir savunma değil, açıktır.
Kodlanmış çıktı neden girişten her zaman daha uzun?
Her Base64 karakteri yalnızca 6 bit bilgi taşır; bir giriş baytı 8 bit taşır. Dolayısıyla her 3 giriş baytı 4 çıktı karakterine dönüşür — 4/3 (≈%33) şişme. Dolguyla (padding) çok kısa girişler 4'ün katına yuvarlanır ve birkaç bayt daha eklenir.
Base64 ile Base64url arasındaki fark nedir?
Alfabede iki karakter. Standart Base64, 64 sembolün sonuncuları için '+' ve '/' kullanır ve dolgu için '=' ekler. Base64url, '+' yerine '-', '/' yerine '_' kullanır; böylece çıktı daha fazla escape olmaksızın URL'lerde ve dosya adlarında güvenle kullanılabilir. JWT'ler ek olarak '=' dolgusunu tamamen çıkarır. İki varyant doğrudan birbirleriyle değiştirilemez; sınırda dönüştürme (transcode) yapılması gerekir.
Dolgu (=) neden bazen görünür, bazen görünmez?
Dolgu çıktı uzunluğunu 4'ün katı yapar — bazı katı dekoderler (eski e-posta ağ geçitleri, belirli TLS sertifikaları) bunu gerektirir. Modern web standartları (JWT, OAuth PKCE, WebPush) uzunluğun her zaman çıkarılabilmesi nedeniyle dolguyu çıkarır. Bilinmeyen bir dekodere veri iletecekseniz dolguyu ekleyin; JWT veya RFC 4648 §5 ile uyumlu bir şey üretiyorsanız çıkarın.
Base64, Unicode dizelerini doğrudan işleyebilir mi?
Hayır — Base64, karakterleri değil baytları kodlar. Bir Unicode dizesini Base64 ile kodlamak için önce onu bayta (evrensel seçim UTF-8'dir) dönüştürmeniz, ardından bu baytları Base64 ile kodlamanız gerekir. Bu adımı atlamak, Base64 işleyen kodlardaki her 'mojibake' (karakter bozulması) hatasının kaynağıdır.
Veri URI'leri (data:image/png;base64,...) resim gömmek için doğru yol mudur?
Küçük simgeler ve satır içi SVG için evet — bir HTTP istek-cevabı döngüsü tasarruf eder. Birkaç KB'dan büyük her şey için hayır — %33 şişme, ayrı bir istekten daha pahalıya mal olur, veri bağımsız olarak önbelleğe alınamaz ve tarayıcılar veri URI'lerini ana iş parçacığında ayrıştırır; bu da render'ı engeller.

Sources & references

Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.

Related

Published May 31, 2026