Base64 Nedir? Kodlama ile Şifreleme Arasındaki Fark
Base64, ikili veriyi harf, rakam, artı ve eğik çizgiden oluşan 64 karakterlik bir alfabeyle metne çeviren kodlama yöntemidir. RFC 4648 ile tanımlanır. Anahtar kullanmaz ve herkes onu geri çevirebilir, bu yüzden gizlilik sağlamaz. E-posta eklerinde, veri adreslerinde ve web belirteçlerinde veriyi bozulmadan taşımak için kullanılır.
Base64 nedir sorusunun kısa cevabı şu: ikili veriyi 64 karakterlik bir alfabeyle metne çeviren bir kodlama. Şifreleme değildir, anahtar istemez ve herkes tek komutla geri çevirir. Bu yazıda nasıl çalıştığını elle hesaplayarak görecek, kodlama, şifreleme ve hash farkını netleştirecek, gerçek hayatta ve CTF'de Base64'ü nasıl tanıyacağını öğreneceksin.
Base64 nedir ve nasıl çalışır?
Bazı sistemler yalnız metin taşır. E-posta bunun klasik örneğidir. Bir görseli ya da bir dosyayı bu kanallardan bozmadan geçirmek için baytları güvenli karakterlere çevirmen gerekir. Base64 bu işi yapar.
RFC 4648'e göre işleyiş şöyledir: girdi üçer baytlık (24 bitlik) gruplara bölünür. Her grup dört tane 6 bitlik parçaya ayrılır. Her parça 0 ile 63 arasında bir sayıdır ve alfabedeki bir karaktere karşılık gelir.
| Değer aralığı | Karakterler |
|---|---|
| 0-25 | A-Z |
| 26-51 | a-z |
| 52-61 | 0-9 |
| 62 | + |
| 63 | / |
| Dolgu | = |
Elle bir örnek yapalım ve "Kod" kelimesini kodlayalım:
- Baytlar: K = 01001011, o = 01101111, d = 01100100.
- 24 biti altışarlı böl: 010010, 110110, 111101, 100100.
- Sayıya çevir: 18, 54, 61, 36.
- Alfabeden karşılıklarını al: S, 2, 9, k.
Sonuç S29k olur. Girdi üçün katı değilse son gruba dolgu eklenir. Tek bayt kalırsa iki, iki bayt kalırsa bir eşittir işareti gelir. "M" harfi TQ==, "Ma" ise TWE= olarak kodlanır.
Her 3 bayt 4 karaktere dönüştüğü için çıktı girdiden yaklaşık üçte bir büyüktür. Base64 veriyi küçültmez, yalnız taşınabilir hale getirir.
Bazı sistemler çıktıyı satırlara böler. RFC 4648, MIME'ın Base64 satırlarını 76 karakterle sınırladığını not eder. Bu yüzden e-posta kaynağında Base64 metni alt alta dizilmiş satırlar halinde görünür. Aynı belge, PEM biçiminin 64 karakterlik satır kullandığını da belirtir. Sertifika dosyalarında BEGIN CERTIFICATE satırları arasında gördüğün blok da Base64'tür. Çözerken bu satır sonlarını sorun etme, araçların çoğu onları atlar. Çözücü "geçersiz girdi" hatası veriyorsa metnin eksik kopyalanıp kopyalanmadığına ya da base64url olup olmadığına bak.
Base64 neden şifreleme değildir?
Şifrelemenin özü anahtardır: veriyi yalnız anahtarı bilen açabilir. Base64'te anahtar yoktur. Alfabe ve kurallar standarttır, herkes aynı adımları tersine uygular. RFC 4648'in güvenlik bölümü de bunu açıkça söyler: Base64 parolalar gibi kolay tanınan bilgiyi gözden saklayabilir ama hiçbir hesaplamalı gizlilik sağlamaz.
Gerçek hayattan bir örnek HTTP Basic kimlik doğrulamasıdır. RFC 7617'ye göre tarayıcı kullanıcı adını ve parolayı iki nokta ile birleştirip Base64 ile kodlar:
Authorization: Basic a3VsbGFuaWNpOnBhcm9sYQ==
Bu başlığı gören herkes kullanici:parola metnine tek komutla ulaşır. Basic kimlik doğrulamasının yalnız TLS ile şifrelenmiş bağlantı üzerinde kullanılmasının nedeni budur.
Aynı yanlış anlama başka yerlerde de karşına çıkar. Kubernetes belgeleri, Secret nesnelerindeki değerlerin Base64 ile tutulduğunu ve varsayılan olarak şifrelenmeden saklandığını belirtir. API erişimi olan herkes bu değerleri okuyabilir. Gizlilik için ayrıca şifreleme ve erişim kısıtlaması gerekir.
Sık görülen hatalar:
- Parolaları veritabanında Base64 ile saklamak.
- API anahtarını kod deposuna Base64'e çevirip koymak.
- Kişisel veriyi "kodladık" diye korunmuş saymak.
Kodlama, şifreleme ve hash arasındaki fark nedir?
Üçü sık karıştırılır ama amaçları farklıdır:
| Özellik | Kodlama | Şifreleme | Hash |
|---|---|---|---|
| Amaç | Taşıma ve uyumluluk | Gizlilik | Bütünlük ve parola saklama |
| Anahtar | Yok | Var | Yok |
| Geri çevrilir mi | Evet, herkes | Yalnız anahtarla | Hayır |
| Çıktı boyutu | Girdiye bağlı | Girdiye bağlı | Sabit |
| Örnek | Base64, URL kodlama | AES, RSA | SHA-256, bcrypt, Argon2 |
Kısa bir kural: biçim değiştirmek istiyorsan kodlama, saklamak istiyorsan şifreleme, doğrulamak istiyorsan hash kullan. Parolalar şifrelenmez, tuzlu ve yavaş bir hash ile saklanır. Ayrıntıları hashing nedir yazısında, anahtarlı şifrelemenin türlerini şifreleme nedir yazısında bulabilirsin.
Base64 nasıl çözülür ve kodlanır?
Her sistemde hazır bir araç vardır. Linux ve macOS'ta:
printf 'Kod' | base64 echo 'S29k' | base64 -d
Windows PowerShell'de:
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("Kod"))
[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("S29k"))
PowerShell'in -EncodedCommand parametresine verilecek metni hazırlarken UTF8 yerine Unicode kodlamasını kullan, çünkü bu parametre UTF-16LE bekler. Tarayıcıda CyberChef'in To Base64 ve From Base64 işlemleri aynı işi yapar.
Kodlarken echo yerine printf kullan. echo sona satır sonu ekler ve "Kod" S29kCg== olarak çıkar. Bu küçük fark, bir bayrak karşılaştırmasını ya da bir parola özetini bozmaya yeter.
CyberChef, GCHQ'nun açık kaynak aracıdır. Bütün işlemleri tarayıcında yapar ve girdiyi sunucuya göndermez. Rastgele çevrimiçi çözücülere ise gizli veri yapıştırma.
Base64'ü gerçek hayatta nerede görürsün?
- E-posta ekleri: MIME, ikili ekleri Base64 ile metne çevirir.
- Veri adresleri: Web sayfasına gömülü küçük görseller
data:image/png;base64,ile başlar. - JSON Web Token: Üç parçalı belirtecin ilk iki parçası base64url ile kodlanmış JSON'dur. İçerik imzalıdır ama şifreli değildir. Belirtece gizli bilgi koyma.
- PowerShell: Microsoft belgelerine göre
-EncodedCommandparametresi UTF-16LE ile kodlanmış bir komutun Base64 halini kabul eder. Saldırganlar bu parametreyi komutlarını basit filtrelerden gizlemek için de kullanır. Günlüklerde bu parametreyi ve uzun Base64 öbeklerini görürsen çözüp oku.
CTF'de Base64 nasıl tanınır?
CTF yarışmalarında Base64, başlangıç sorularının ve çok katmanlı bulmacaların vazgeçilmezidir. Tanıma ipuçları:
- Metin yalnız harf, rakam, artı ve eğik çizgiden oluşur. base64url'de artı ve eğik çizgi yerine tire ve alt çizgi görürsün.
- Sonda bir ya da iki eşittir olabilir.
- Dolgulu çıktının uzunluğu dördün katıdır.
Çözülen verinin türünü ilk karakterlerden de tahmin edebilirsin:
| Base64 başlangıcı | Çözülünce ne çıkar |
|---|---|
iVBORw0KGgo | PNG görseli |
JVBERi0 | PDF belgesi |
UEsDB | ZIP arşivi (ofis belgeleri de olabilir) |
TVqQ | Windows çalıştırılabilir dosyası (MZ başlığı) |
eyJ | JSON metni, genellikle bir JWT parçası |
Çıkan sonuç yine kodlanmış olabilir. Katmanları sırayla aç ve her adımı not et. Bir görselin içinden Base64 metni çıkıyorsa steganografi sorusuyla karşı karşıyasındır. Yarışmalara başlamak için CTF nedir yazısını oku. Base64 gibi temel kavramların kısa tanımları siber güvenlik sözlüğünde duruyor.
Çözdüğün veri TVqQ ile başlıyorsa bir program dosyasıyla uğraşıyorsun demektir. Onu çalıştırma, yalnız izole bir ortamda incele.
Base64 kullanırken hangi hatalardan kaçınmalısın?
Geliştirici olarak şu kuralları uygula:
- Gizli bilgiyi Base64 ile "saklama". Parola için tuzlu ve yavaş bir hash, veri için gerçek bir şifreleme kullan.
- API anahtarlarını ve parolaları kod deposuna koyma, Base64'e çevrilmiş hallerini de koyma. Gizli anahtar yönetim aracı kullan.
- JWT gövdesine kişisel veri ya da yetki sırrı yazma. İmza içeriği korumaz, yalnız değiştirilmediğini gösterir.
- Kullanıcıdan gelen Base64 verisini çözdükten sonra da doğrula. Kodlama, içindeki zararlı girdiyi zararsız yapmaz.
Analist olarak da iki alışkanlık edin. Günlükte uzun bir Base64 öbeği gördüğünde onu görmezden gelme, çöz ve oku. Çözülen veri yine anlamsızsa ikinci bir katman olabilir: yeniden Base64, sıkıştırma ya da basit bir XOR. Her katmanı ayrı not et, böylece aynı zinciri başka bir olayda hızla tanırsın.
Kaynaklar
Sık sorulan sorular
Base64 bir şifreleme yöntemi mi?
Hayır. Base64 bir kodlamadır. Algoritması herkese açıktır ve çözmek için anahtar gerekmez. RFC 4648 de bu kodlamanın bilgiyi gözden saklasa bile hiçbir hesaplamalı gizlilik sağlamadığını yazar. Parola ya da kişisel veriyi Base64 ile saklamak onu açık metin olarak saklamakla aynıdır. Gizlilik gerekiyorsa gerçek bir şifreleme kullan.
Base64 nasıl çözülür?
Linux'ta ve güncel macOS'ta echo 'S29k' | base64 -d komutu metni çözer. Windows PowerShell'de [Convert]::FromBase64String yöntemiyle baytlara çevirip UTF8.GetString ile okursun. Tarayıcıda CyberChef'in From Base64 işlemi de iş görür ve verini sunucuya göndermez. Kaynağını bilmediğin çözülmüş içeriği hiçbir zaman çalıştırma, önce metin olarak oku.
Base64 çıktısının sonundaki eşittir işareti ne anlama gelir?
Eşittir işareti dolgudur. Base64 veriyi üçer baytlık gruplar halinde işler. Son grupta yalnız bir bayt kalırsa çıktının sonuna iki eşittir, iki bayt kalırsa bir eşittir eklenir. Bu yüzden M harfi TQ== olarak, Ma ikilisi TWE= olarak kodlanır. Veri tam üçün katıysa dolgu yoktur.
Base64 ile base64url arasındaki fark nedir?
İkisi aynı mantıkla çalışır, yalnız iki karakter farklıdır. Standart Base64 alfabesindeki artı ve eğik çizgi, base64url'de tire ve alt çizgi olur. Bu sayede çıktı adres çubuğunda ve dosya adlarında sorun çıkarmaz. JSON Web Token gibi biçimler base64url kullanır ve genellikle sondaki dolgu karakterlerini atar.
Kodlama, şifreleme ve hash arasındaki fark nedir?
Kodlama veriyi başka bir biçime çevirir ve herkes geri çevirebilir, amacı taşımadır. Şifreleme veriyi anahtarla okunmaz hale getirir ve yalnız anahtarı olan açabilir, amacı gizliliktir. Hash ise veriden sabit uzunlukta tek yönlü bir özet üretir, geri çevrilmez. Bütünlük kontrolü ve parola saklama için kullanılır.
- Base64
- kodlama
- şifreleme
- hash
- CTF