Base64
7 araç
Kodlama Nedir?
Kodlama, verilerin bir gösterimden diğerine dönüştürülmesi sürecidir. Web geliştirmede kodlama, sınırlı bir karakter kümesi için tasarlanmış kanallar üzerinden verileri güvenli biçimde iletmek amacıyla kullanılır — örneğin metin tabanlı bir protokol üzerinden ikili veri göndermek ya da URL içine özel karakterler eklemek.
Karakter kodlama, metin karakterlerinin baytlara nasıl eşlendiğini tanımlar. Base64 kodlama, ikili verileri ASCII metne dönüştürür. URL kodlama, herhangi bir metni URL'lerde kullanılmaya uygun hale getirir. Bu üç kodlama katmanını anlamak, ince hataları ve güvenlik açıklarını önler.
Karakter Kodlama Tarihi
Karakter kodlama, karakterler (harfler, semboller) ile bunların ikili gösterimleri arasındaki eşlemedir. ASCII'den Unicode'a geçiş, webin küreselleşmesini yansıtır:
7 bitlik Amerikan Standart Kodu. 128 karakter: İngilizce harfler, rakamlar, noktalama işaretleri ve kontrol kodları. Diğer tüm kodlamaların temelini oluşturan kodlamayı tanımlamıştır.
Batı Avrupa dilleri için genişletilmiş ASCII. 128 karakter eklendi (aksanlı harfler, semboller). Latin dışı yazı sistemleri için uygun değil.
Dünyanın tüm yazı sistemlerini kapsayan evrensel karakter kümesi. 161 yazı sisteminde 149.000'den fazla karakter için kod noktaları tanımlar. Kodlamayı tanımlamaz — bu UTF-8/16/32'nin görevidir.
Karakter başına 1–4 bayt kullanan değişken genişlikli Unicode kodlaması. ASCII uyumlu (ilk 128 kod noktası tek bayttır). Web'de baskın kodlama — sitelerin %98'inden fazlası tarafından kullanılır.
Karakter başına 2 veya 4 bayt kullanan değişken genişlikli kodlama. Windows, Java ve JavaScript dizeleri tarafından dahili olarak kullanılır. ASCII uyumlu değildir.
Sabit genişlikli kodlama: her karakter için daima 4 bayt. Basit ancak yer israfı yapar. Bazı veritabanı iç yapılarında kullanılır. Web'de nadiren görülür.
UTF-8 Neden Kazandı
UTF-8 hakimiyete ulaştı çünkü ASCII ile geriye dönük uyumludur (ilk 128 karakter aynı şekilde kodlanır), kendi kendini senkronize eder (tarayarak karakter sınırlarını bulabilirsiniz) ve Latin metni için alan açısından verimlidir. Her ASCII belgesi geçerli bir UTF-8 belgesidir. Bu durum geçişi sorunsuz hale getirdi.
Base64 Kodlaması
Base64, ikili verileri yalnızca 64 yazdırılabilir ASCII karakteri kullanarak metin gösterimine dönüştürür: A-Z, a-z, 0-9, + ve /. Bu, ikili verilerin yalnızca metin işleyen kanallardan geçmesi gerektiğinde zorunludur — e-posta ekleri, data URI'leri, JWT token'ları ve HTTP Basic Auth hepsi Base64 kullanır.
Nasıl Çalışır
Base64, giriş baytlarını 3 baytlık (24 bitlik) parçalara gruplandırır ve her parçayı 4 Base64 karakteriyle (her biri 6 bit) kodlar. Giriş 3 baytın katı değilse, son grubu tamamlamak için = dolgu karakterleri eklenir:
| Giriş | Hex baytlar | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
Sondaki = dolgu karakterleri, son 3 baytlık grubu tamamlamak için kaç baytın eksik olduğunu gösterir. Tek = bir bayt dolgu gerektiği anlamına gelir; == iki bayt gerektiği anlamına gelir. Standart Base64 her zaman uzunluğu 4'ün katı olan çıktı üretir.
URL Kodlaması
URL'ler yalnızca sınırlı sayıda güvenli ASCII karakteri içerebilir. Bu kümenin dışındaki her karakter — boşluklar, noktalama işaretleri, ASCII dışı karakterler ve &, = ve # gibi özel URL karakterleri dahil — URL'ye yerleştirilmeden önce yüzde kodlaması (URL kodlama) uygulanmalıdır.
Yüzde kodlama, güvensiz her baytı o baytın değerini temsil eden iki onaltılık rakamın önüne % eklenerek oluşturulan bir gösterimle değiştirir. Boşluk %20, ve işareti (&) %26 olur ve bu şekilde devam eder.
Sık Kodlanan Karakterler
| Karakter | Kodlanmış | Notlar |
|---|---|---|
| Space | %20 | En yaygın; form gönderimlerinde application/x-www-form-urlencoded içinde + olarak kullanılır |
| & | %26 | Sorgu dizisi ayırıcısı; gerçek değer olarak kullanıldığında kodlanmalıdır |
| = | %3D | Sorgu dizilerinde anahtar-değer ayırıcısı; veri olarak kullanıldığında kodlanır |
| + | %2B | application/x-www-form-urlencoded içinde boşluk olarak yorumlanır; gerçek + değerini korumak için kodlanır |
| # | %23 | Fragment tanımlayıcısı; bir yolda veya sorguda gerçek veri olarak kullanıldığında kodlanır |
| / | %2F | Yol segmenti ayırıcısı; yol sınırlayıcı olarak değil, gerçek veri olarak kullanıldığında kodlanır |
| : | %3A | Şema ayırıcısı; yol ve sorgu bağlamlarında kodlanır |
| @ | %40 | mailto: ve kimlik doğrulamada kullanılır; gerçek veri olarak kullanıldığında kodlanır |
encodeURI vs encodeURIComponent
JavaScript, farklı kapsamlara sahip iki kodlama işlevi sağlar. encodeURI tam bir URL'yi kodlar — URL'lerde anlamı olan karakterleri (:, /, ?, #, @) kodlamadan bırakır. encodeURIComponent bir URL bileşenini (tek bir sorgu parametresi değeri veya yol segmenti) kodlar — A-Z, a-z, 0-9, -, _, ., ~ dışındaki tüm karakterleri kodlar. Bireysel değerler için her zaman encodeURIComponent, tam URL'ler için encodeURI kullanın.
Web Geliştirmede Kodlamanın Kullanıldığı Yerler
Authorization: Basic başlığı, kimlik bilgilerini Base64(kullanıcıadı:parola) olarak kodlar. Bu, güvenlik amacıyla değil, taşıma kolaylığı için yapılan bir kodlamadır — Base64 trivial olarak tersine çevrilebilir. Basic Auth ile her zaman HTTPS kullanın.
Data URI'leri, dosya içeriğini doğrudan HTML veya CSS içine gömer: data:image/png;base64,.... Görüntülerin ve yazı tiplerinin satır içi Base64 kodlaması, HTTP isteklerini ortadan kaldırır; ancak belge boyutunu artırır (~%33 ek yük).
E-posta, 7 bitlik ASCII için tasarlanmıştır. İkili ekler (görüntüler, PDF'ler) iletimden önce MIME tarafından Base64 ile kodlanır. E-posta istemciniz, e-postayı görüntülerken bunları şeffaf biçimde çözer.
JWT token'ları, tüm üç bölüm (başlık, yük, imza) için Base64url kodlamasını (+ yerine - ve / yerine _ kullanan, dolgu içermeyen bir varyant) kullanır. Bu, token'ları ek yüzde kodlaması gerektirmeden URL güvenli kılar.
URL sorgu dizilerindeki kullanıcı tarafından sağlanan tüm veriler yüzde kodlanmalıdır. Bir değerdeki & veya = karakterlerini kodlamamak, sorgu dizisi ayrıştırmasını sessizce bozar. Bireysel değerlerde her zaman encodeURIComponent kullanın.
ASCII dışı alan adları (örn. münchen.de), DNS sistemiyle uyumluluk için Punycode (xn-- öneki) kullanılarak kodlanır. Tarayıcı Unicode biçimini gösterir, ancak DNS çözümleyicilerine Punycode biçimini gönderir.
Sık Sorulan Sorular
Hayır. Base64, şifreleme değil, kodlamadır. Gizli anahtarı olmayan tersine çevrilebilir bir dönüşümdür. Base64 dizesini gören herkes onu anında çözebilir. Base64'ü asla güvenlik önlemi olarak kullanmayın.
Base64, girişi 3 baytlık gruplar halinde işler. Giriş 3 baytın katı değilse, son grubu tamamlamak için = dolgusu eklenir. Tek = bir bayt dolgu; == iki bayt dolgu anlamına gelir. Bazı uygulamalar dolguyu atlar (JWT'ler için Base64url).
Base64url, + yerine - ve / yerine _ kullanan, genellikle = dolgusunu atlayan URL güvenli bir Base64 varyantıdır. Bu, URL'lerde ve HTTP başlıklarında yüzde kodlaması gerekmeden kullanılmasını sağlar. JWT'ler tüm üç bölüm için Base64url kullanır.
Bireysel değerler (sorgu parametresi değerleri, yol segmenti değerleri) için encodeURIComponent kullanın. URL yapı karakterlerini (/, :, ?, #) korumak istediğiniz tam bir URL dizesi için encodeURI kullanın. Emin değilseniz encodeURIComponent kullanın.
UTF-8, ASCII uyumludur ve Latin metni için alan açısından verimlidir (URL'lerin, HTML etiketlerinin ve kodların büyük çoğunluğu ASCII'dir). UTF-16, ASCII içeriği için yer israfı yapar ve geriye dönük uyumlu değildir. HTTP ve HTML varsayılan olarak UTF-8 kullanır.
Yüzde kodlama (URL kodlama), karakterleri % ve ardından iki basamaklı onaltılık bayt değeriyle temsil eder. Örneğin boşluk %20'dir (ondalık 32, hex 20). Çok baytlı UTF-8 karakterleri her baytı ayrı ayrı kodlar: é karakteri %C3%A9 olur.
Base64, veri boyutunu yaklaşık %33 artırır ve kodlama/çözme CPU ek yükü ekler. Yüksek verimli sistemler için ikili protokolleri tercih edin. URL kodlama minimal ek yük ekler, ancak çok sayıda özel karakter içeren URL'leri önemli ölçüde uzatabilir.
Punycode, Unicode karakterlerini ASCII uyumlu DNS sisteminde temsil etmek için kullanılan bir kodlamadır. münchen.de gibi uluslararasılaştırılmış alan adları, DNS sorgularında xn--mnchen-3ya.de olarak kodlanır. Tarayıcılar Unicode biçimini gösterir ancak dahili olarak Punycode kullanır.