
در این مقاله قصد داریم به زبان ساده بررسی کنیم که Base64 چیست، چگونه کار میکند، چه مزایا و معایبی دارد و در چه جاهایی به کار میرود.
انکدینگ Base64 همونطور که از اسمش مشخص هست یک روش انکدینگ برای دادههای باینری است. شاید اینجا سوال پیش بیاید که اصلاً داده باینری چی هستن؟
به طور خلاصه، دادههای باینری اطلاعاتی هستند که فقط با دو مقدار صفر (۰) و یک(۱) ذخیره و پردازش میشوند. هر نوع دادهای که روی کامپیوتر شما وجود دارد—چه متن، چه تصویر، چه صدا یا ویدیو—در نهایت به صورت باینری (یعنی ۰ و ۱) ذخیره میشود.
برای مثال، کاراکتر “A” در استاندارد ASCII معادل عدد 65 است که در باینری به صورت ۸ بیتی 01000001 نمایش داده میشود. یا در مثالی دیگر، اگر در گوشی خود کلمه “Hi” را تایپ کنید، برنامه پیامک درون گوشی شما آن را به 01001000 01101001 (مجموعاً ۱۶ بیت) تبدیل و ارسال میکند. در طرف مقابل نیز این باینریها مجدد به کاراکترهای قابل خواندن برای کاربران تبدیل میشوند.
این توضیح کوتاهی بود از باینری، حال برگردیم بر سر موضوع اصلی خودمون یعنی base64.
دیکدر Base64 چگونه کار میکند؟
این دیکدر یک روش انکدینگ است که دادههای باینری را با استفاده از ۶۴ کاراکتر زیر نمایش میدهد:
همچنین از کاراکتر "=" برای پدینگ (پر کردن) استفاده میشود، که در ادامه توضیح خواهیم داد که پدینگ به چه معنی هست و چطور ازین کاراکتر استفاده میشه.
از آنجا که در Base64 از ۶۴ کاراکتر استفاده میشود، برای نمایش هر کاراکتر نیاز به ۶ (۲ به توان ۶) بیت داریم. علاوه بر این در دیکدینگ Base64 در هر مرحله هر ۳ بلاک ۸ بیتی به ۴ بلاک ۶ بیتی تبدیل میشوند. این یعنی هر ۳ بایت (۲۴ بیت) داده باینری به ۴ کاراکتر Base64 تبدیل میشود. اگر طول داده باینری مضربی از ۳ نباشد، با استفاده از کاراکتر "=" آن را به اندازه لازم میرسانیم. مثلاً:
سعی میکنم در ادامه با دو مثال شیوه تبدیل Base64 رو جا بندازم:

پس کلمه “Man” در فرمت ASCII رو میشه معادل “TWFu” در فرمت Base64 تبدیل کرد.
فرض کنید که بخواهیم پیام “Hi” رو برای دوستمون بفرستیم ولی این بار از انکدر Base64 میخوایم استفاده کنیم. استرینگ Hi از دو کارکتر تشکیل شده. این دو کارکتر در فرمت ASCII هر کدام ۸ بیت هستند که در مجموع ۱۶ بیت رو تشکیل میدن.
"Hi" → 01001000 01101001
گفتیم که انکدر Base64، داده باینری رو ۶ بیت ۶بیت تبدیل میکنه، پس در این مرحله ما ۱۶ بیت باینری رو ۶ بیت ۶بیت جدا میکنیم:
Group "Hi" bits by 6 → 010010_000110_1001
مشاهده میکنید که نمیتونیم داده مورد نظر رو به صورت ۶ بیت جدا کنیم چون ۱۶ مضربی از ۶ نیست. پس دو صفر اضافه میکنیم که قابل تقسیم باشه:
Add two "0" at the end → 010010_000110_100100
پس به ۳ گروه ۶ تایی رسیدیم، ولی اگر به خاطر داشته باشید، Base64 با بلوک های ۴ تایی ۶ بیتی کار میکرد. به همین دلیل نیاز داریم که یک بلوک ۶ تایی اضافه کنیم. بلوک انتهایی رو با صفر پر میکنیم:
Add a 6bit block at the end → 010010_000110_100100_000000
حال هر ۴ بلوک ۶ تایی داریم که قابل تبدیل به ۴ کارکتر base64 هستند:

اما ازونجایی که کارکتر آخر رو خودمون اضافه کردیم، به جای کارکتر "A" از “=” استفاده میکنیم. به این ترتیب تونستیم Hi رو با فرمت Base64 انکد کنیم:

کارکتر “=” استفاده میشه که نتیجه انکد شده نهایی رو طولش رو به مضربی از ۴ برسونه و هیچ دیتایی رو منتقل نمیکنه. در واقع صرفا به دیکدر میگه که داده اصلی کمتر از یک گروه ۳ بایتی بوده و من مجبور شدم که با اضافه کردن صفر اون رو به ۲۴ بیت برسونم.
به عنوان تمرین، شما این داده انکد شده به فرمت Base64 رو تبدیل به ASCII کنید و توی کامنتها بنویسید: (جواب انتهای مقاله هست)

چرا از base64 استفاده میکنیم؟
خیلی از سیستمها صرفا دادههای تکست رو ساپورت میکنن. به طور مثال در دادههای JSON شما اطلاعات رو صرفا میتونید به صورت استرینگ منتقل کنید. حال فرض کنید که میخواید در ابجکت JSON خودتون آواتار کاربر رو هم منتقل کنید.
همونطور که پیشتر گفتیم تصویر یک فایل باینری هست برای اینکه بتونیم اون رو توسط JSON منتقل کنیم ابتدا باید اون رو به صورت استرینگ تبدیل کنیم تا سپس بتونیم از طریق JSON منتقل کنیم. برای این منظور، میایم و اون عکس رو به وسیله فرمت Base64 به استرینگ تبدیل میکنیم. پس از تبدیل به استرینگ این قابلیت رو داره که داخل ابجکت JSON ما منتقل بشه.
کجا ها میتونیم استفاده کنیم؟
معایب استفاده از Base64:
اگرچه Base64 خیلی مفید فایده است و در توسعه وب خیلی استفاده میشه ولی یکسری نکات منفی هم داره که خوبه بهشون توجه کنیم. این نکات منفی شامل موارد زیر میشه:
۱- سایز بیشتر:
در شیوه انکدینگ Base64 هر۳ بایت داده باینری به ۴ کارکتر تبدیل میکنه. این به اون معنی هست که داده انکد شده با base64 تقریبا ۳۳ درصد بزرگتر خواهد بود نسبت به داده باینری اورجینال.
به طور مثال اگر داده اصلی ۱۰۰ کیلوبایت باشه تبدیل اون به صورت base64 حجم اون رو به ۱۳۳ کیلوبایت افزایش میده.
۲- پرفورمنس کم برای فایلهای بزرگ
مرورگر باید داده انکد شده توسط base64 رو دیکد کنه تا بتونه ازون استفاده کنه. اگر این فایل خیلی بزرگ باشه، به طور مثال برای تصاویر پر حجم، میتونه منجر به کند شدن فرایند رندر بشه. به خصوص در دستگاههای ضعیفتر.
۳- عدم کش شدن
اگر ما تصاویر رو با استفاده از تبدیلشون با Base64 به صورت امبدد در HTML استفاده کنیم، مرورگر قادر به کش کردن اون نیست. در نتیجه در هر بار درخواست نیاز به دریافت و پردازش خواهد بود.
۴- استفاده نادرست برای امنیت
ممکنه بعضی از دولوپرها تصور کنند که base64 نوعی از انکریپشن هست. با توجه به توضیحاتی که داده شد باید بدونیم که base64 یک شیوه انکدینگ هست که به راحتی توسط هرفردی قابل دیکد شدن است. پس به هیچ وجه امن نیست.
بیس۶۴ یک شیوهی انکدینگ برای تبدیل دادههای باینری به رشتهی متنی است که معمولاً در انتقال دادههایی مثل تصاویر، در محیطهایی که فقط داده متنی را میپذیرند (مانند JSON)، کاربرد دارد. با این حال استفاده از آن معایبی هم دارد که باید با آگاهی کامل از آنها بهره گرفت.
در دنیای توسعه وب، دانستن ابزارهایی مثل Base64 و درک دقیق نحوه کارکرد آنها، میتواند در بسیاری از موقعیتها به شما کمک کند. چه هنگام انتقال داده، چه در توسعه API و یا حتی در اپلیکیشنهای موبایل. اما نباید فراموش کرد که استفادهی نادرست و بدون آگاهی، میتواند باعث مشکلاتی در عملکرد، امنیت و کارایی سیستم شود. همیشه قبل از استفاده، مزایا و معایب را بررسی کرده و انتخابی آگاهانه داشته باشید.
پ.ن: جواب سوال مطرح شده در مقاله: "You are awesome!"