Base64 Encoding nedir ve nerelerde kullanılır?

Bu flood’da Base64 Encoding tekniğinin ne olduğunu ve nerelerde kullanıldığını anlatacağım.

Base64 Encoding binary verileri metne dönüştürerek saklamaya veya iletmeye yarayan tekniklerden en yaygın olarak kullanılanıdır. Bu teknik ile temel olarak 8 bitlik baytlardan oluşan binary veri 6 bitlik (2^6 = 64) parçalara bölünür.

6 bit ile ifade edilen 64 farklı sayı, ASCII karakter kümesinde Printable Character olarak ifade edilen ve aşağıda gösterilen 64 farklı karakterle eşleştirilmiştir. Eldeki 6 bitlik verinin bu tablo ile eşleştirilmesi ile Base64 Encoding yapılmış olur.

Aşağıdaki örnekte 6 ile tam bölünebilen 24 bitlik (3 baytlık) ASD metni Base64 Encoding ile kodlanmıştır.

Base64 kodlama yapılacak verideki bayt sayısının 3'ün tam katı olmadığı durumda, verideki bayt sayısı 3'ün tam katı olana kadar veriye Padding yapılır ve asıl veride olmayan parçalar çıktıda = ile gösterilir. Aşağıdaki örnekte AS metni padding ile kodlanmıştır.

Padding işleminden dolayı Base64 ile kodlanan verilerin çoğunlukla = veya == sonlandığı görülür. Burada akla padding'e neden gerek olduğu sorusu gelebilir. Veri boyutunun Base64'ü decode eden tarafça da bilindiği durumlarda padding'e aslında gerek olmadığı savunulabilir. Bu gözlem aslında doğrudur fakat tekniğin genelgeçer olarak her durumda çalışması için Padding kullanılmaktadır. Örneğin, Base64'ün bir video akış (stream) uygulamasında kullanılması (veri boyutunun anlık olarak bilinemeyeceği) durumunda Padding'e ihtiyaç olacaktır.

Base64 Encoding'ün ağırlıklı kullanım alanı, metin iletmek üzere kurgulanmış ve binary uyumu olmayan mail, HTTP, FTP gibi protokoller ile binary veri iletmektir. Bu protokoller ile binary veri iletilememesinin sebebi bu protokoller tarafından özel olarak değerlendirilen (CRLF) gibi özel karakterlerin binary veri içinde geçme riskidir. Örnek olarak CRLF - Carriage Return / Line Feed HTTP istemci veya sunucusu tarafından Line Ending olarak algılanacaktır. Base64 Encoding ile veride özel karakter olmayacağı garanti edilmiş olur.

Base64 kodlama ile kodlaması yapılan her 3 bayt için 1 bayt harcandığı ve veri boyutunun yaklaşık olarak 3'te 1 oranında arttığı görülmektedir. Bu oran veri transfer performansını olumsuz etkileyecektir fakat bu konuda yapılabilecek pek bir şey maalesef yoktur.

Base64 Encoding'in bir kullanım alanı da modern tarayıcılarda imaj ve diğer dosyaların Data URLs formatı kullanılarak HTML ve CSS dokümanlarına Base64 ile kodlanarak eklenebilmesidir. Örn: <img src="data:image/jpeg:base64,a2ossA== />

Linux benzeri sistemlerde base64 programı kullanılarak verilen girdiler Base64 Encode ve Base64 Decode işlemine tabi tutulabilir. Aşağıdaki base64 programı ile birkaç örnek verilmiştir.

Base64'ün en yaygın kullanım alanlarından biri de çeşitli nedenlerle binary yerine metin formatında saklanmak istenen verilerin kodlanmasıdır. MD5 ya da SHA1 sonucunda çıkan binary Hash değeri efektif bir şekilde Base64 ile kodlanabilir.

Son olarak, MD5 ya da SHA1 sonucunda çıkan binary değer, her bir bayt 4'er bitlik iki parçaya bölünüp bu bölümlerin hex karşılıkları ile de verimsiz olarak metne çevrilebilir. Burada her bayt iki bayta dönüştürüldüğü için kayıp Base64'e göre fazla olacaktır.