Eğitim Portalı/Java/Base64 Kodlama
Java01-java/71-base64

Base64 Kodlama

Base64, ikili (binary) veriyi yalnızca güvenli ASCII karakterleriyle (A–Z, a–z, 0–9, +, /) temsil eden bir kodlama şemasıdır. Amaç, yalnızca metin taşıyabilen kanallardan (JSON, XML, e-posta, URL, HTTP başlıkları) iki…

Base64 Kodlama

Base64, ikili (binary) veriyi yalnızca güvenli ASCII karakterleriyle (A–Z, a–z, 0–9, +, /) temsil eden bir kodlama şemasıdır. Amaç, yalnızca metin taşıyabilen kanallardan (JSON, XML, e-posta, URL, HTTP başlıkları) ikili veriyi sorunsuz geçirmektir. Java 8'den beri java.util.Base64 sınıfıyla temiz bir API sunulur. En kritik nokta: Base64 şifreleme değildir — gizlilik sağlamaz.

Temel kodlama ve çözme

String kodlu = Base64.getEncoder().encodeToString(metin.getBytes(StandardCharsets.UTF_8));
byte[] cozulen = Base64.getDecoder().decode(kodlu);
String geri = new String(cozulen, StandardCharsets.UTF_8);

Örnek 1 (./Ornek1.java) metin kodlama/çözme döngüsünü gösterir. Kodlama kayıpsızdır: çözünce orijinali birebir geri alırsın.

Üç varyant (encoder türü)

EncoderNe yaparNerede
getEncoder()Standart Base64 (+, /)Genel amaçlı
getUrlEncoder()URL-güvenli (-, _)URL, dosya adı, JWT
getMimeEncoder()76 karakterde satır kırarE-posta ekleri, PEM sertifikaları
  • URL-güvenli: Standart Base64'teki + ve / karakterleri URL'de ve dosya adlarında sorun çıkarır; URL encoder bunları - ve _ yapar. JWT token'ları bunu kullanır.
  • MIME: Uzun çıktıyı 76 karakterlik satırlara böler (eski e-posta/sertifika formatları için).

Örnek 1 URL-güvenli kodlamayı, Örnek 2 (./Ornek2.java) ikili veri ve MIME kodlamayı gösterir.

Gerçek kullanım örnekleri

  • HTTP Basic Authentication: Authorization: Basic base64("kullanıcı:parola"). Örnek 2 bunu üretir. Çözülebilir olduğu için HTTPS zorunludur.
  • Data URL'leri: data:image/png;base64,iVBOR... — küçük resimleri HTML/CSS içine gömme.
  • JSON/XML içinde ikili veri: Bir resmi/dosyayı JSON alanında taşımak.
  • JWT: Token'ın bölümleri URL-güvenli Base64 ile kodlanır.

Önemli uyarılar

Base64 ŞİFRELEME DEĞİLDİR. Herkes anında çözebilir; hiçbir gizlilik sağlamaz. Hassas veri için gerçek şifreleme (AES vb.) kullan. Base64 yalnızca "ikili veriyi metin kanalından geçirme" işidir.

Boyut artışı: Base64, veriyi yaklaşık %33 büyütür (her 3 bayt → 4 karakter). Sıkıştırma değil, kodlamadır; bant genişliği/depolama hesabında bunu unutma.

Özet

Base64'ün ikili veriyi güvenli ASCII metnine çeviren bir kodlama olduğunu; temel kodlama/çözmeyi ve üç varyantı — standart, URL-güvenli, MIME (Örnek 1–2) — öğrendik; Basic Auth, data URL, JWT gibi gerçek kullanımları ve iki kritik uyarıyı (şifreleme değildir, %33 büyütür) gördük. Bununla Misc bölümünün bu turdaki kısmı (Regex, Serialization, Recursion, Process API, Base64) tamamlandı.

Kod Örnekleri(2)

Ornek1

çalıştırılabilir
Ornek1.java
1// Ornek1: Base64 — metni/veriyi güvenle taşınabilir metne kodlama ve çözme.
2// Çalıştırma: java Ornek1.java
3import java.nio.charset.StandardCharsets;
4import java.util.Base64;
5
6public class Ornek1 {
7
8    public static void main(String[] args) {
9        String orijinal = "Merhaba Dünya! (Türkçe + özel: @#&)";
10
11        // Temel (standart) Base64 kodlama:
12        String kodlu = Base64.getEncoder().encodeToString(orijinal.getBytes(StandardCharsets.UTF_8));
13        System.out.println("Orijinal: " + orijinal);
14        System.out.println("Base64  : " + kodlu);
15
16        // Çözme (decode):
17        byte[] cozulen = Base64.getDecoder().decode(kodlu);
18        String geri = new String(cozulen, StandardCharsets.UTF_8);
19        System.out.println("Çözülen : " + geri);
20        System.out.println("Aynı mı?  " + orijinal.equals(geri));
21
22        // URL-güvenli Base64: '+' ve '/' yerine '-' ve '_' (URL/dosya adında sorun çıkarmaz).
23        String url = "veri?ad=ada&tip=a/b+c";
24        String urlKodlu = Base64.getUrlEncoder().encodeToString(url.getBytes(StandardCharsets.UTF_8));
25        System.out.println("\nURL-güvenli Base64: " + urlKodlu);
26        System.out.println("  (standart kodlamada '/' ve '+' olurdu; URL'de sorun çıkarırdı)");
27
28        System.out.println("""
29
30                --- Base64 ---
31                İkili (binary) veriyi yalnızca güvenli ASCII karakterlerle (A-Z a-z 0-9 + /) temsil eder.
32                getEncoder()/getDecoder(): standart. getUrlEncoder(): URL/dosya-güvenli (-_).
33                Kullanım: ikili veriyi metin taşıyan yerlerde göndermek — JSON/XML içinde, e-posta ekleri,
34                  data URL'leri (data:image/png;base64,...), HTTP Basic Authorization başlığı.
35                ÇOK ÖNEMLİ: Base64 ŞİFRELEME DEĞİLDİR! Herkes kolayca çözer; gizlilik SAĞLAMAZ.""");
36    }
37}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// Ornek2: Base64 ile ikili veri, MIME kodlama ve gerçek kullanım (Basic Auth başlığı).
2// Çalıştırma: java Ornek2.java
3import java.nio.charset.StandardCharsets;
4import java.util.Base64;
5
6public class Ornek2 {
7
8    public static void main(String[] args) {
9        // 1) İkili (binary) veriyi kodlama — örn. bir dosyanın baytları.
10        byte[] ikili = { (byte) 0x00, (byte) 0xFF, (byte) 0x10, (byte) 0x80, 65, 66, 67 };
11        String kodlu = Base64.getEncoder().encodeToString(ikili);
12        System.out.println("İkili veri Base64: " + kodlu);
13        byte[] geri = Base64.getDecoder().decode(kodlu);
14        System.out.println("İlk bayt geri: " + (geri[0] & 0xFF) + ", uzunluk: " + geri.length);
15
16        // 2) MIME kodlama: 76 karakterde bir satır kırar (e-posta/sertifika formatları için).
17        byte[] uzun = "Bu çok uzun bir metin; MIME kodlama 76 karakterde bir satır başı koyar. ".repeat(3)
18                .getBytes(StandardCharsets.UTF_8);
19        String mime = Base64.getMimeEncoder().encodeToString(uzun);
20        System.out.println("\nMIME kodlama (satırlara bölünmüş):");
21        System.out.println(mime);
22
23        // 3) Gerçek kullanım: HTTP Basic Authorization başlığı = base64("kullanici:parola")
24        String kimlik = "ada:parola123";
25        String basic = "Basic " + Base64.getEncoder().encodeToString(kimlik.getBytes(StandardCharsets.UTF_8));
26        System.out.println("\nAuthorization başlığı: " + basic);
27        System.out.println("  (sunucu bunu çözer; bu yüzden HTTPS şart — base64 gizlilik DEĞİL!)");
28
29        System.out.println("""
30
31                --- İkili veri, MIME ve gerçek kullanım ---
32                Base64, ikili veriyi (resim, dosya, ham bayt) metin kanallarından geçirmek için kodlar.
33                getMimeEncoder(): satırları 76 karakterde böler (e-posta ekleri, PEM sertifikaları).
34                Gerçek örnek: HTTP Basic Auth başlığı base64(kullanıcı:parola)'dur — bu yüzden HTTPS zorunludur.
35                Boyut: Base64, veriyi ~%33 BÜYÜTÜR (3 bayt -> 4 karakter). Sıkıştırma değildir, kodlamadır.
36                Tekrar: Base64 ŞİFRELEME DEĞİLDİR; gizlilik için şifreleme (AES vb.) kullan.""");
37    }
38}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.