Kod tabanınızda muhtemelen Base64 dizelerini görmüşsünüzdür — JWT token'larında, HTML <img> etiketlerinde, HTTP Authorization başlıklarında veya dosya verisi taşıyan JSON payload'larında. Anlamsız görünürler: SGVsbG8sIFdvcmxkIQ==. Ancak var olmalarının basit bir nedeni vardır ve bunu anladığınızda Base64 gizemini kaybeder ve araç kutunuzda gerçekten işlevsel bir araç haline gelir.

Base64 Gerçekte Nedir

Base64, bir ikili-metin kodlama şemasıdır. Hepsi bu. Null karakterler, kontrol kodları veya 0'dan 255'e kadar herhangi bir değer içerebilen rastgele ikili veriyi alır ve yalnızca 64 yazdırılabilir ASCII karakteri kullanarak temsil eder. Sonuç, bozulmadan veya yanlış yorumlanmadan herhangi bir metin tabanlı kanaldan güvenle geçebilen bir dizedir.

Resmi spesifikasyon IETF tarafından yayımlanan RFC 4648'de yer almaktadır. Hem standart Base64'ü hem de URL güvenli varyantı tanımlar. Dolgu kuralları veya alfabe seçimleri hakkında bir tartışmayı çözmek istediğinizde başvurmak için kaydetmeye değer.

Base64 Alfabesi

64 karakterlik alfabe şunlardan oluşur: büyük harfler A–Z (26 karakter), küçük harfler a–z (26 karakter), rakamlar 0–9 (10 karakter) ve iki sembol: + ve /. Bu size tam olarak 64 karakter verir — dolayısıyla bu isim. = işareti, giriş uzunluğu 3'ün katı olmadığında sonda dolgu karakteri olarak kullanılır.

text
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Her karakter tam olarak 6 bit veri kodlar (2^6 = 64 olası değer). Bu, kodlamanın arkasındaki temel mekanizmadır — ve ~%33'lük boyut artışının nedenidir.

Kodlama Nasıl Çalışır

Algoritma, 3 bayt → 4 Base64 karakteri parçaları halinde çalışır. Üç bayt = 24 bit. Bu 24 biti dört 6-bitlik gruba bölün; her grup Base64 alfabesindeki bir karakterle eşleşir.

text
Input:  "Man"
Bytes:  M=77 (01001101)  a=97 (01100001)  n=110 (01101110)
Bits:   010011 010110 000101 101110
Index:  19     22     5      46
Output: T      W      F      u     →  "TWFu"

Giriş 3'e bölünemediğinde dolgu devreye girer. Kalan iki bayt, bir = ile birlikte üç Base64 karakteri olur. Kalan bir bayt ise == ile birlikte iki Base64 karakteri olur. Dolgu, yalnızca kod çözücüye sonda kaç bayt bulunduğunu söyler — verinin kendisinin bir parçası değildir.

Boyut artışı: her 3 bayt giriş, 4 karakterlik çıktıya dönüşür. Bu, boyutta %33 artış demektir. Küçük dizeler için ihmal edilebilir. Büyük ikili dosyalar için — 10 MB'lık bir resim yaklaşık 13,3 MB Base64'e dönüşür — artış önemlidir ve doğrudan gömlemeden önce iki kez düşünmelisiniz.

JavaScript'te Kodlama ve Kod Çözme

Tarayıcılar btoa() ve atob() fonksiyonlarını global olarak sunar. Basittirler ancak bir tuzakları vardır: yalnızca Latin-1 karakterlerini (bayt değerleri 0–255) işlerler. Çok baytlı bir Unicode dizesini doğrudan geçerseniz InvalidCharacterError alırsınız.

js
// Basic browser encoding/decoding
const encoded = btoa('Hello, World!');  // "SGVsbG8sIFdvcmxkIQ=="
const decoded = atob('SGVsbG8sIFdvcmxkIQ==');  // "Hello, World!"

// Safe Unicode version — encode to UTF-8 first
function encodeUnicode(str) {
  return btoa(
    encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, (_, hex) =>
      String.fromCharCode(parseInt(hex, 16))
    )
  );
}

function decodeUnicode(str) {
  return decodeURIComponent(
    atob(str)
      .split('')
      .map(c => '%' + c.charCodeAt(0).toString(16).padStart(2, '0'))
      .join('')
  );
}

const emoji = encodeUnicode('Héllo wörld 🌍');
console.log(emoji);                  // "SMOpbGxvIHfDtnJsZCDwn4yN"
console.log(decodeUnicode(emoji));   // "Héllo wörld 🌍"

Node.js — Buffer Kullanımı

Node.js'de deyimsel yaklaşım, Unicode'u kutudan çıkar çıkmaz doğru şekilde işleyen ve yukarıdaki tarayıcı geçici çözümünden çok daha temiz olan Buffer API'sidir.

js
// Encoding
const encoded = Buffer.from('Hello, World!', 'utf8').toString('base64');
console.log(encoded);  // "SGVsbG8sIFdvcmxkIQ=="

// Decoding
const decoded = Buffer.from('SGVsbG8sIFdvcmxkIQ==', 'base64').toString('utf8');
console.log(decoded);  // "Hello, World!"

// Encoding a file to Base64 (e.g. to embed in a JSON payload)
const fs = require('fs');

function fileToBase64(filePath) {
  const fileBuffer = fs.readFileSync(filePath);
  return fileBuffer.toString('base64');
}

function base64ToFile(base64String, outputPath) {
  const fileBuffer = Buffer.from(base64String, 'base64');
  fs.writeFileSync(outputPath, fileBuffer);
}

const avatarBase64 = fileToBase64('./uploads/avatar.png');
const payload = {
  userId: 'usr_8f3k2',
  avatarData: avatarBase64,
  mimeType: 'image/png'
};

Python — base64 Modülü

Python'ın standart kütüphanesi, kodlama, kod çözme ve URL güvenli varyantı işleyen bir base64 modülü içerir. Fonksiyonlar bytes nesneleriyle çalışır, bu nedenle genellikle dizeleri açık bir karakter setiyle kodlar/kod çözersiniz.

python
import base64

# Encoding a string
message = "Hello, World!"
encoded = base64.b64encode(message.encode("utf-8"))
print(encoded)           # b'SGVsbG8sIFdvcmxkIQ=='
print(encoded.decode())  # 'SGVsbG8sIFdvcmxkIQ=='

# Decoding
decoded_bytes = base64.b64decode("SGVsbG8sIFdvcmxkIQ==")
print(decoded_bytes.decode("utf-8"))  # 'Hello, World!'

# Encoding a file
with open("report.pdf", "rb") as f:
    pdf_base64 = base64.b64encode(f.read()).decode("utf-8")

# Embedding it in a JSON-compatible structure
import json
payload = {
    "filename": "report.pdf",
    "content": pdf_base64,
    "encoding": "base64"
}
print(json.dumps(payload, indent=2))

URL Güvenli Base64

Standart Base64, URL'lerde özel karakter olan + ve / kullanır. Standart bir Base64 dizesini bir sorgu parametresine bırakırsanız, önce yüzde kodlama yapmazsanız sessiz bozulma meydana gelir. URL güvenli Base64 (aynı zamanda RFC 4648 §5'te tanımlanmıştır), +'yı - ile ve /'yı _ ile değiştirerek bunu çözer. Dolgu = işaretleri URL bağlamlarında genellikle tamamen atlanır.

js
// Standard → URL-safe conversion in JavaScript
function toBase64Url(base64) {
  return base64
    .replace(/+/g, '-')
    .replace(///g, '_')
    .replace(/=+$/, '');  // strip padding
}

function fromBase64Url(base64url) {
  // Restore padding
  const padded = base64url + '=='.slice(0, (4 - (base64url.length % 4)) % 4);
  return padded.replace(/-/g, '+').replace(/_/g, '/');
}

const standard = btoa('some binary  data');
const urlSafe  = toBase64Url(standard);

console.log(standard);  // "c29tZSBiaW5hcnkAAGRhdGE="
console.log(urlSafe);   // "c29tZSBiaW5hcnkAAGRhdGE"  (safe for URLs)

Python'da base64.urlsafe_b64encode() ve base64.urlsafe_b64decode() kullanın — bunlar değiştirmeyi otomatik olarak yapar.

Yaygın Gerçek Dünya Kullanım Senaryoları

  • HTML/CSS'e resim gömmesrc="data:image/png;base64,iVBORw0KGgo..." gibi bir data: URI'si, ayrı bir HTTP isteğini ortadan kaldırır. Küçük simgeler ve sprite'lar için mükemmel; %33'lük boyut artışı nedeniyle büyük resimler için uygun değildir.
  • JWT token'ları — bir JSON Web Token'ın başlık ve payload bölümleri, URL güvenli Base64 ile kodlanmış JSON nesneleridir. Bir JWT'de gördüğünüz üç noktalı bölüm şöyledir: Base64Url(başlık).Base64Url(payload).Base64Url(imza).
  • HTTP Temel Kimlik DoğrulamaAuthorization: Basic ... başlığı kullanıcı_adı:şifre'yi Base64 olarak kodlar. RFC 7617'de tanımlanmıştır. Not: Bu kodlama, şifreleme değildir — her zaman HTTPS kullanın.
  • JSON'a ikili veri gömme — JSON'ın ikili türü yoktur, bu nedenle API aracılığıyla gönderilen dosyalar, resimler ve sertifikalar genellikle bir dize alanına Base64 olarak kodlanır. Bu iş akışı için Dosya'dan Base64'e ve Resimden Base64'e araçlarına bakın.
  • E-posta ekleri — E-postanın altında yatan format olan MIME, ikili ekleri yalnızca metin posta aktarma sunucuları üzerinden iletimde hayatta kalmaları için Base64 kullanarak kodlar. Base64'ün tasarlandığı orijinal problem.
  • Veritabanlarında ikili veri depolama — bir metin sütununda veya JSON belgesi içinde küçük bir blob (sertifika, küçük resim) depolamanız gerektiğinde, Base64 standart seçimdir.

Base64 ŞİFRELEME DEĞİLDİR

Bu, insanları sürekli yanıltır — özellikle kod incelemelerinde. Base64 kodlamadır, şifreleme değil. Kodlama, verinin temsilini değiştiren geri dönüşümlü bir dönüşümdür. Şifreleme ise veriyi gizli bir anahtarla karıştırır, böylece yalnızca anahtara sahip olan kişi tersine çevirebilir.

Herkes saniyeler içinde bir Base64 dizesini çözebilir — Base64 Kod Çözücü'ye yapıştırın ve işiniz biter. Şifreler, API anahtarları veya kişisel veriler gibi hassas değerleri "gizlemek" için asla Base64 kullanmayın. Gizlilik gerekiyorsa gerçek şifreleme kullanın (AES, RSA veya tarayıcıda Web Crypto API veya Python'da cryptography gibi bir kütüphane).

Belirtmeye değer bir başka nokta: Base64 sıkıştırma da değildir. Çıktı her zaman girişten daha büyüktür — yaklaşık üçte bir. Boyutu küçültmeniz gerekiyorsa önce sıkıştırın (gzip, Brotli, zstd), ardından kanal metin gerektiriyorsa sıkıştırılmış baytları Base64 ile kodlayın.

Base64 ile Çalışmak için Araçlar

Base64 ile günlük çalışıyorsanız, hızlı araçlara sahip olmak gerçekten fark yaratır. Herhangi bir metin dizesini kodlamak için Base64 Encoder'ı, Base64 değerlerini çözmek ve incelemek için Base64 Decoder'ı, API payload'ları veya depolama için ikili dosyaları dönüştürmek amacıyla Dosya'dan Base64'e'yi ve resimleri doğrudan HTML veya CSS'e gömmek için veri URI'leri oluşturmak amacıyla Resimden Base64'e'yi kullanın.

Özet

Base64, tek bir sorunu çözmek için vardır: ikili veriyi bozulmadan yalnızca metin kanallarından geçirmek. Bunu, her 3 bayt girişi 64 karakterlik (A–Z, a–z, 0–9, +, /) bir alfabe kullanarak 4 yazdırılabilir ASCII karakteriyle eşleyerek yapar. Sonuç, e-posta, HTTP başlıkları, JSON alanları ve URL'ler için (URL güvenli varyantıyla) güvenlidir. Ödünleşim, sabit %33'lük boyut artışıdır. Şifreleme değildir, sıkıştırma değildir — şeffaf, geri dönüşümlü bir kodlamadır. Bunu bir kez özümsedikten sonra, ne zaman kullanacağınızı ve ne zaman farklı bir aracın daha uygun olduğunu hemen anlarsınız.