Base64 এনকোডিং
7টি টুল
এনকোডিং কী?
এনকোডিং হলো এক রূপ থেকে অন্য রূপে ডেটা রূপান্তরের প্রক্রিয়া। ওয়েব ডেভেলপমেন্টে, সীমিত অক্ষর সেটের জন্য ডিজাইন করা চ্যানেলের মাধ্যমে ডেটা নিরাপদে পাঠাতে এনকোডিং ব্যবহৃত হয় — যেমন, টেক্সট-ভিত্তিক প্রোটোকলের মাধ্যমে বাইনারি ডেটা পাঠানো, বা URL-এ বিশেষ অক্ষর অন্তর্ভুক্ত করা।
অক্ষর এনকোডিং নির্ধারণ করে টেক্সট অক্ষরগুলি কীভাবে বাইটে রূপান্তরিত হয়। Base64 এনকোডিং বাইনারি ডেটাকে ASCII টেক্সটে রূপান্তরিত করে। URL এনকোডিং যেকোনো টেক্সটকে URL-এ ব্যবহারের জন্য নিরাপদ করে তোলে। এনকোডিংয়ের এই তিনটি স্তর বোঝা সূক্ষ্ম বাগ এবং নিরাপত্তা দুর্বলতা প্রতিরোধ করে।
অক্ষর এনকোডিংয়ের ইতিহাস
অক্ষর এনকোডিং হলো অক্ষর (বর্ণ, প্রতীক) এবং তাদের বাইনারি উপস্থাপনার মধ্যে সম্পর্ক। ASCII থেকে Unicode-এর বিবর্তনে ওয়েব কীভাবে বৈশ্বিক হয়ে উঠেছে তা স্পষ্টভাবে বোঝা যায়:
৭-বিটের American Standard Code। ১২৮টি অক্ষর: ইংরেজি বর্ণ, অঙ্ক, বিরাম চিহ্ন এবং নিয়ন্ত্রণ কোড। মূল এনকোডিং, যার উপর ভিত্তি করে অন্য সব এনকোডিং তৈরি।
পশ্চিম ইউরোপীয় ভাষার জন্য বর্ধিত ASCII। আরও ১২৮টি অক্ষর যোগ করা হয়েছে (অ্যাকসেন্টযুক্ত বর্ণ, প্রতীক)। ল্যাটিন-বহির্ভূত লিপির জন্য উপযুক্ত নয়।
বিশ্বের সকল লিখন পদ্ধতি অন্তর্ভুক্ত করা সার্বজনীন অক্ষর সেট। ১৬১টি লিপিতে ১,৪৯,০০০-এরও বেশি অক্ষরের কোড পয়েন্ট নির্ধারণ করে। এনকোডিং নির্ধারণ করে না — সেটা হলো UTF-8/16/32।
প্রতি অক্ষরে ১–৪ বাইট ব্যবহার করে Unicode-এর পরিবর্তনশীল-প্রস্থ এনকোডিং। ASCII-সামঞ্জস্যপূর্ণ (প্রথম ১২৮ কোড পয়েন্ট একক বাইট)। ওয়েবে প্রভাবশালী এনকোডিং — ৯৮%-এরও বেশি ওয়েবসাইট।
প্রতি অক্ষরে ২ বা ৪ বাইট ব্যবহার করে পরিবর্তনশীল-প্রস্থ এনকোডিং। Windows, Java এবং JavaScript স্ট্রিংয়ে অভ্যন্তরীণভাবে ব্যবহৃত। ASCII-সামঞ্জস্যপূর্ণ নয়।
স্থির-প্রস্থ এনকোডিং: সবসময় প্রতি অক্ষরে ৪ বাইট। সরল কিন্তু জায়গা নষ্ট করে। কিছু ডেটাবেসের অভ্যন্তরীণ কাজে ব্যবহৃত। ওয়েবে খুব কমই দেখা যায়।
কেন UTF-8 জয়ী হলো
UTF-8 প্রভাবশালী হয়ে উঠেছে কারণ এটি ASCII-র সাথে পশ্চাৎ-সামঞ্জস্যপূর্ণ (প্রথম ১২৮টি অক্ষর একইভাবে এনকোড হয়), self-synchronizing (স্ক্যান করে অক্ষর সীমানা খুঁজে পাওয়া যায়) এবং ল্যাটিন টেক্সটের জন্য স্থান-সাশ্রয়ী। যেকোনো ASCII ডকুমেন্ট একটি বৈধ UTF-8 ডকুমেন্ট। এটি মাইগ্রেশনকে অনেক সহজ করে দিয়েছিল।
Base64 এনকোডিং
Base64 শুধুমাত্র ৬৪টি মুদ্রণযোগ্য ASCII অক্ষর ব্যবহার করে বাইনারি ডেটাকে টেক্সটে রূপান্তরিত করে: A-Z, a-z, 0-9, + এবং /। এটি প্রয়োজনীয় যখন বাইনারি ডেটাকে কেবল টেক্সট পরিচালনাকারী চ্যানেলের মধ্য দিয়ে যেতে হয় — ইমেইল অ্যাটাচমেন্ট, ডেটা URI, JWT টোকেন এবং HTTP Basic Auth সবই Base64 ব্যবহার করে।
এটি কীভাবে কাজ করে
Base64 ইনপুট বাইটগুলোকে ৩-বাইট (২৪-বিট) খণ্ডে ভাগ করে এবং প্রতিটি খণ্ডকে ৪টি Base64 অক্ষর (প্রতিটি ৬ বিট) হিসেবে এনকোড করে। যদি ইনপুট ৩ বাইটের গুণিতক না হয়, শেষ গ্রুপ সম্পূর্ণ করতে = প্যাডিং অক্ষর যোগ করা হয়:
| ইনপুট | হেক্স বাইট | Base64 |
|---|---|---|
| "Man" | 77 61 6E | TWFu |
| "Ma" | 4D 61 | TWE= |
| "M" | 4D | TQ== |
শেষে = প্যাডিং অক্ষরগুলো নির্দেশ করে যে শেষ ৩-বাইট গ্রুপ সম্পূর্ণ করতে কতটি বাইট অনুপস্থিত ছিল। একটি = মানে এক বাইট প্যাডিং প্রয়োজন ছিল; == মানে দুই বাইট প্রয়োজন ছিল। Standard Base64 সর্বদা এমন আউটপুট তৈরি করে যার দৈর্ঘ্য ৪-এর গুণিতক।
URL এনকোডিং
URL-এ কেবল সীমিত সংখ্যক নিরাপদ ASCII অক্ষর থাকতে পারে। সেই সেটের বাইরের যেকোনো অক্ষর — স্পেস, বিরাম চিহ্ন, non-ASCII অক্ষর এবং &, = এবং # এর মতো বিশেষ URL অক্ষর সহ — URL-এ রাখার আগে পার্সেন্ট-এনকোড (URL-এনকোড) করতে হবে।
পার্সেন্ট এনকোডিং প্রতিটি অনিরাপদ বাইটকে একটি % দিয়ে প্রতিস্থাপন করে যার পরে দুটি হেক্সাডেসিমেল অঙ্ক থাকে যা সেই বাইটের মান উপস্থাপন করে। একটি স্পেস %20 হয়, একটি অ্যাম্পারস্যান্ড %26 হয়, এবং এভাবে চলে।
সাধারণভাবে এনকোড করা অক্ষর
| অক্ষর | এনকোড করা | নোট |
|---|---|---|
| Space | %20 | সবচেয়ে সাধারণ; application/x-www-form-urlencoded-এ ফর্ম জমার সময় + হিসেবে ব্যবহৃত |
| & | %26 | কোয়েরি স্ট্রিং বিভাজক; আক্ষরিক মান হিসেবে ব্যবহৃত হলে অবশ্যই এনকোড করতে হবে |
| = | %3D | কোয়েরি স্ট্রিংয়ে কী-মান বিভাজক; ডেটা হিসেবে ব্যবহৃত হলে এনকোড করুন |
| + | %2B | application/x-www-form-urlencoded-এ স্পেস হিসেবে ব্যাখ্যা করা হয়; আক্ষরিক + সংরক্ষণ করতে এনকোড করুন |
| # | %23 | ফ্র্যাগমেন্ট শনাক্তকারী; পাথ বা কোয়েরিতে আক্ষরিক ডেটা হিসেবে ব্যবহৃত হলে এনকোড করুন |
| / | %2F | পাথ সেগমেন্ট বিভাজক; আক্ষরিক ডেটা হিসেবে ব্যবহৃত হলে এনকোড করুন, পাথ সীমানা হিসেবে নয় |
| : | %3A | স্কিম বিভাজক; পাথ এবং কোয়েরি প্রসঙ্গে এনকোড করুন |
| @ | %40 | mailto: এবং auth-এ ব্যবহৃত; আক্ষরিক ডেটা হিসেবে ব্যবহৃত হলে এনকোড করুন |
encodeURI বনাম encodeURIComponent
JavaScript দুটি ভিন্ন পরিসরের এনকোডিং ফাংশন প্রদান করে। encodeURI একটি সম্পূর্ণ URL এনকোড করে — এটি URL-এ অর্থপূর্ণ অক্ষর (:, /, ?, #, @) এনকোড করে না। encodeURIComponent একটি URL উপাদান (একটি একক কোয়েরি প্যারামিটার মান বা পাথ সেগমেন্ট) এনকোড করে — এটি A-Z, a-z, 0-9, -, _, ., ~ ছাড়া সব অক্ষর এনকোড করে। পৃথক মানের জন্য সর্বদা encodeURIComponent এবং সম্পূর্ণ URL-এর জন্য encodeURI ব্যবহার করুন।
ওয়েব ডেভেলপমেন্টে এনকোডিং কোথায় দেখা যায়
Authorization: Basic হেডার ক্রেডেনশিয়ালকে Base64(username:password) হিসেবে এনকোড করে। এটা ডেটা পাঠানোর সুবিধার জন্য এনকোডিং, নিরাপত্তার জন্য নয় — Base64 সহজেই উল্টানো যায়। Basic Auth-এর সাথে সর্বদা HTTPS ব্যবহার করুন।
Data URI সরাসরি HTML বা CSS-এ ফাইল বিষয়বস্তু এম্বেড করে: data:image/png;base64,....। ইনলাইনে ছবি ও ফন্ট Base64 এনকোড করলে HTTP অনুরোধ দূর হয়, তবে ডকুমেন্টের আকার বৃদ্ধি পায় (~৩৩% ওভারহেড)।
ইমেইল ৭-বিট ASCII-এর জন্য ডিজাইন করা হয়েছিল। বাইনারি অ্যাটাচমেন্ট (ছবি, PDF) প্রেরণের আগে MIME দ্বারা Base64 এনকোড করা হয়। ইমেইল প্রদর্শনের সময় আপনার ইমেইল ক্লায়েন্ট সেগুলো নিজে থেকেই ডিকোড করে নেয়।
JWT টোকেন তিনটি অংশের (হেডার, পেলোড, সিগনেচার) সবগুলোর জন্য Base64url এনকোডিং (একটি ভেরিয়েন্ট যা + কে - এবং / কে _ দিয়ে প্রতিস্থাপন করে, প্যাডিং ছাড়া) ব্যবহার করে। এটি অতিরিক্ত পার্সেন্ট-এনকোডিং ছাড়াই টোকেনগুলোকে URL-নিরাপদ করে।
URL কোয়েরি স্ট্রিংয়ে যেকোনো ব্যবহারকারী-প্রদত্ত ডেটা অবশ্যই পার্সেন্ট-এনকোড করতে হবে। কোনো মানে & বা = এনকোড করতে ব্যর্থ হলে কোয়েরি স্ট্রিং পার্সিং নীরবে নষ্ট হয়ে যাবে। পৃথক মানের উপর সর্বদা encodeURIComponent ব্যবহার করুন।
Non-ASCII ডোমেইন নাম (যেমন, münchen.de) DNS সিস্টেমের সাথে সামঞ্জস্যের জন্য Punycode (xn-- উপসর্গ) ব্যবহার করে এনকোড করা হয়। ব্রাউজার Unicode রূপটি প্রদর্শন করে কিন্তু DNS রেজোলভারে Punycode রূপটি পাঠায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
না। Base64 হলো এনকোডিং, এনক্রিপশন নয়। এটি কোনো গোপন কী ছাড়া একটি বিপরীতমুখী রূপান্তর। Base64 স্ট্রিং যে কেউ দেখলে তাৎক্ষণিকভাবে ডিকোড করতে পারে। Base64 কখনো নিরাপত্তা ব্যবস্থা হিসেবে ব্যবহার করবেন না।
Base64 ইনপুট ৩-বাইট গ্রুপে প্রক্রিয়া করে। যদি ইনপুট ৩ বাইটের গুণিতক না হয়, শেষ গ্রুপ সম্পূর্ণ করতে = প্যাডিং যোগ করা হয়। একটি = মানে এক বাইট প্যাডিং; == মানে দুই বাইট। কিছু বাস্তবায়ন প্যাডিং বাদ দেয় (JWT-এর জন্য Base64url)।
Base64url হলো Base64-এর URL-নিরাপদ একটি ভেরিয়েন্ট যা + কে - এবং / কে _ দিয়ে প্রতিস্থাপন করে এবং সাধারণত = প্যাডিং বাদ দেয়। এটি পার্সেন্ট-এনকোডিং ছাড়াই URL এবং HTTP হেডারে ব্যবহারের জন্য নিরাপদ। JWT সব তিনটি অংশের জন্য Base64url ব্যবহার করে।
পৃথক মানের জন্য encodeURIComponent ব্যবহার করুন (কোয়েরি প্যারামিটার মান, পাথ সেগমেন্ট মান)। সম্পূর্ণ URL স্ট্রিংয়ের জন্য encodeURI ব্যবহার করুন যেখানে আপনি URL কাঠামো অক্ষর (/, :, ?, #) সংরক্ষণ করতে চান। সন্দেহ হলে encodeURIComponent ব্যবহার করুন।
UTF-8 ASCII-সামঞ্জস্যপূর্ণ এবং ল্যাটিন টেক্সটের জন্য স্থান-সাশ্রয়ী (বেশিরভাগ URL, HTML ট্যাগ এবং কোড ASCII)। UTF-16 ASCII বিষয়বস্তুর জন্য জায়গা নষ্ট করে এবং পশ্চাৎ-সামঞ্জস্যপূর্ণ নয়। HTTP এবং HTML ডিফল্টে UTF-8 ব্যবহার করে।
পার্সেন্ট এনকোডিং (URL এনকোডিং) অক্ষরগুলোকে % দিয়ে উপস্থাপন করে যার পরে তাদের দুই-অঙ্কের হেক্সাডেসিমেল বাইট মান থাকে। যেমন, একটি স্পেস হলো %20 (দশমিক ৩২, হেক্স ২০)। বহু-বাইট UTF-8 অক্ষর প্রতিটি বাইট আলাদাভাবে এনকোড করে: é হলো %C3%A9।
Base64 ডেটার আকার প্রায় ৩৩% বৃদ্ধি করে এবং এনকোডিং/ডিকোডিং CPU ওভারহেড যোগ করে। উচ্চ-থ্রুপুট সিস্টেমের জন্য বাইনারি প্রোটোকল পছন্দ করুন। URL এনকোডিং ন্যূনতম ওভারহেড যোগ করে তবে অনেক বিশেষ অক্ষরের ক্ষেত্রে URL উল্লেখযোগ্যভাবে দীর্ঘ হতে পারে।
Punycode হলো ASCII-সামঞ্জস্যপূর্ণ DNS সিস্টেমে Unicode অক্ষর উপস্থাপনার একটি এনকোডিং। münchen.de-র মতো আন্তর্জাতিকীকৃত ডোমেইন নামগুলো DNS কোয়েরিতে xn--mnchen-3ya.de হিসেবে এনকোড করা হয়। ব্রাউজার Unicode রূপটি প্রদর্শন করে কিন্তু অভ্যন্তরীণভাবে Punycode ব্যবহার করে।