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ü)
| Encoder | Ne yapar | Nerede |
|---|---|---|
getEncoder() | Standart Base64 (+, /) | Genel amaçlı |
getUrlEncoder() | URL-güvenli (-, _) | URL, dosya adı, JWT |
getMimeEncoder() | 76 karakterde satır kırar | E-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ılabilir1// 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}Ornek2
çalıştırılabilir1// 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}