Encoding, Encryption, Hashing: একই নাকি ভিন্ন?
Encoding, Encryption এবং Hashing — এই টার্মগুলি হয়তো অনেক জায়গায়ই শুনে থাকবেন। কেউ কেউ হয়তো কিছুটা বুঝেছেন, কিছুটা বোঝেননি। কিংবা যে জায়গায় যে প্রেক্ষাপটে জিনিসটা ব্যাখ্যা করা হয়েছে সেই কন্টেক্সটে সেটা বুঝেছেন, কিন্তু এদের মধ্যে আসলে মিল কি, পার্থক্যই বা কি সেটা হয়তো কখনো প্রশ্ন করার অবকাশ পান নি। আপনার ক্ষেত্রে যদি আসলেই এরকম ঘটে থাকে, তাহলে আজকের লেখাটি আপনারই জন্য। কারণ Encoding, Encryption, Hashing — তিনটিই ডাটাকে এক ফরম্যাট থেকে অন্য ফরম্যাটে পরিবর্তন করলেও তাঁদের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে যা জানা থাকা খুবই জরুরী।
বেশী কথা বাড়াবো না, আমি সহজভাবে অল্প কথায় এদের পরিচয় দেয়ার চেষ্টা করছি।
Encoding
আপনি হয়তো মোর্সকোডের(Morse Code) নাম শুনেছেন। শোনেননি? আরে, ঐ যে আগেকার আমলে যুদ্ধের সময় বা জরুরী প্রয়োজনে যন্ত্র ব্যবহার করে কিছু সাংকেতিক শব্দ প্রেরন করা হতো এক জায়গা থেকে অন্য জায়গায় — সেটার কথাই বলছি। ভুলে গিয়েছেন? তাহলে নীচের ভিডিওটি দেখে আসুন।
মনে পড়েছে? হ্যাঁ, এখানে এইযে ইংরেজী বর্ণমালার অক্ষরগুলিকে অন্য একধরনের সঙ্কেত দিয়ে প্রকাশ করা হতো এটাও মূলত এক ধরনের Encoding. নীচে দেখুন, Wikipedia তে সুন্দর একটা চার্ট দেয়া আছে প্রতিটা বর্ণের জন্য মোর্স কোড কেমন সেটার জন্য।
তারমানে, কেউ যদি কাউকে মোর্স কোডে সংকেত পাঠায় তাহলে অপরজন খুব সহজেই তাঁর অর্থ উদ্ধার করতে পারবে যদি তাঁরকাছে মোর্সকোডের এই চার্টটি থাকে।
আবার এই যে আপনি বাংলা বর্ণে এই লেখাটি পড়ছেন, এই লেখাটি কি কম্পিউটার এভাবে তার মেমোরীতে রেখেছে? তা কিন্তু রাখেনি। কম্পিউটার তার মেমোরীতে এটাকে বাইনারী ফরম্যাটে স্টোর করে রেখেছে। কিন্তু আমরা যখন আমাদের ব্রাউজারে বা এপে এই ডাটা দেখছি তখন কিন্তু আমরা বাইনারী হিসেবে দেখছি না, সেই ডাটাটা বাংলা বর্ণে পরিবর্তিত অবস্থায় দেখছি, যে কারণে আমরা সেটা পড়তে পারছি। এই যে একটা ডাটাকে ভিন্ন একটা ডাটা ফরম্যাটে পরিবর্তন করা যাতে করে অন্য কোনো সিস্টেম সেটাকে সহজে ব্যবহার করতে পারে সেটাকেই বলা হয় Encoding. এখানে কয়েকটা ব্যাপার লক্ষ্যণীয়।
- Encoding ডাটাকে গোপন করে না, অর্থাৎ এর লক্ষ্য ডাটা কারো কাছ থেকে লুকানো না। গোপনীয়তার সাথে এর কোনো সম্পর্ক নেই। Encoding কেবলমাত্র এক ফরম্যাট থেকে অন্য আরেকটা গ্রহণযোগ্য এবং প্রচলিত ফরম্যাটে ডাটা পরিবর্তন করে।
- কোনো একটা ডাটাকে যে পদ্ধতিতে Encoding করে পরিবর্তন করা হলো, সেই পদ্ধতিতেই তাকে আবার আগের ফরম্যাটে নেয়া সম্ভব।
- Encoding এর মেথডগুলো সব জায়গায় একই এবং সেটা সবার জন্য উন্মুক্ত। যে কেউ চাইলেই এই মেথড ব্যবহার করতে পারে এবং সেটাই আসলে মূল লক্ষ্য।
আপনি হয়তো ASCII, Unicode এ নামগুলোর সাথে পরিচিত। এগুলো হচ্ছে জনপ্রিয় Encoding মেথড।
Encryption
Encryption হচ্ছে অনেকটা ‘তালা মাইরা দিছে ছাইড়া, চাবি ছাড়া খুলবে না রে ’ — টাইপ সিস্টেম। মানে মনে করেন আপনি আপনার পরিচিত কাউকে কোনো গোপন তথ্য বা ম্যাসেজ পাঠাতে চাচ্ছেন এবং সেটা যাতে অন্য কেউ দেখলেও বুঝতে না পারে। তখন আপনি আপনার ম্যাসেজটাকে এমনভাবে Encrypt করে পাঠাবেন যাতে করে শুধুমাত্র যাকে পাঠাচ্ছেন সে এটাকে Decrypt করে পড়তে পারে। এই পদ্ধতিটাই হচ্ছে Encryption এবং এক্ষেত্রে যেটা ব্যবহার করে Encrypt/Decrypt করা হয় সেটাকে বলে Key. এক্ষেত্রে যদি একই key দিয়ে Encrypt এবং Decrypt করা হয় তাহলে সেটাকে বলে Symmetric Encryption.
কিন্তু এটা একটু কম নির্ভরযোগ্য প্রসেস। কারণ ম্যাসেজ যিনি পাঠাচ্ছেন এবং যিনি গ্রহন করছেন দুজনের কাছেই একই Key থাকতে হবে, এবং এই Key টা গোপন রাখা তখন দুষ্কর। কারণ আপনাকে তো এই Key টাও গোপনীয়তার সাথে আরেকজনের কাছে পাঠাতে হবে। তাছাড়া একজনের কাছে যেই Key দিয়ে ম্যাসেজ পাঠিয়েছেন আরেকজনের কাছে তো সেই একই Key দিয়ে ম্যাসেজ পাঠালে সেটা আগেরজন চাইলেই পড়তে পারবে। এজন্য আরেকটু ভালো পদ্ধতি ব্যবহার করা হয়ে যেখানে ২টি ভিন্ন key ব্যবহার করা হয়, যেটা Asymmetric encryption বা Public-key encryption নামে পরিচিত। এ পদ্ধতিতে যিনি ম্যাসেজ পাঠাচ্ছেন তাঁর কাছে একটা private key থাকে যেটা দিয়ে তিনি তাঁর কাছে পাঠানো ম্যাসেজ Decrypt করে পড়তে পারেন। আর তিনি একটা public key সবার জন্য উন্মুক্ত করে দেন যেটা ব্যবহার করে যে কেউ তাকে ম্যাসেজ Encrypt করে পাঠাতে পারে। যেহেতু শুধুমাত্র private key ব্যবহার করেই ম্যাসেজটি পড়া যাবে, তাই এই পদ্ধতিতে অন্য কেউ চাইলেই ম্যাসেজটি পড়তে পারবে না।
যাই হোক, এতক্ষণে নিশ্চয়ই এটা বোঝা গেছে যে, Encryption এ গোপনীয়তার ব্যাপারটা মূখ্য। এছাড়াও, যার জন্য নির্ধারিত সে ছাড়া অন্য কেউ যেন ডাটাটার পাঠোদ্ধার করতে না পারে সেটা নিশ্চিত করা হয় Encryption এ।
বিভিন্ন রকম Encryption মেথডের মধ্যে AES, RSA, BlowFish জনপ্রিয়।
এখানে ছোট্ট করে আরেকটা তথ্য দিয়ে রাখি। Steganography — এর নাম শুনেছেন কখনো? এটাও এক রকম তথ্য গোপন করার বিদ্যা। ড্যান ব্রাউনের বই যদি পড়ে থাকেন তাহলে নিশ্চয়ই সেখানে দেখেছেন যে ছবি, বিখ্যাত চিত্রকর্ম বা ভাস্কর্যে অনেক তথ্য লুকোনো থাকে। এটাই হচ্ছে Steganography — কোনো একটা খুব পরিচিত মাধ্যমে কোনো একটা তথ্য লুকিয়ে রাখা। Encryption এর সাথে Steganography এর মূল পার্থক্য হচ্ছে, Encrypted ডাটা দেখে কেউ হয়তো বুঝবে এখানে কিছু একটা গোপন করা হয়েছে, নির্দিষ্ট চাবি ছাড়া এটা উদ্ধার করা সম্ভব না। আর Steganography সাধারণ লোকচক্ষুর আড়ালে এমনভাবে তথ্যটা লুকিয়ে রাখে যে বোঝাই যায় না এখানে কিছু একটা লুকোনো থাকতে পারে, অথচ সেই গোপন তথ্যটা হয়তো খুব সহজেই উদ্ধার করা সম্ভব।
Hashing
মনে করেন, আপনি একজন শিক্ষক। আপনার ছাত্র-ছাত্রীদের আপনি একটি এসাইনমেন্ট করতে দিয়েছেন এবং সেটি অনলাইনে ডকুমেন্ট হিসেবে সাবমিট করতে বলেছেন। যদিও আপনি বার বার করে বলে দিয়েছেন কেউ যাতে একজনের এসাইনমেন্ট আরেকজন কপি না করে, তারপরেও আপনি জানেন যে উল্লেখযোগ্য সংখ্যক অলস পোলাপান আরেকজনের এসাইনমেন্ট একেবারে হুবহু কপি-পেস্ট করে মেরে দিবে। এখন আপনি কিভাবে একটা একটা করে এসাইনমেন্ট যাচাই করে এরকম কপি-পেস্ট আছে কিনা বুঝবেন? এরকম ক্ষেত্রে আপনাকে উদ্ধার করতে পারে Hashing. আপনি যদি এসাইনমেন্টগুলোকে একটা Hashing এলগোরিদমে ইনপুট হিসেবে দেন তাহলে সেটা আপনাকে একটা Hashed Data বা Digest দিবে এবং সেটা খুব বেশী বড় হবে না। এরপর আপনি এই ডাইজেস্টগুলোকে মিলিয়ে দেখলেই খুব সহজে ধরে ফেলতে পারবেন কোন এসাইনমেন্টগুলো একেবারে হুবহু কপি-পেস্ট। Hashing এর যেই গুণগুলোর কারণে আপনি এটাকে কাজে লাগাতে পারছেন তা হলো-
- দুটি সম্পূর্ণ একই রকম ডাটার জন্য Hashing এলগোরিদম অবশ্যই একইরকম আউটপুট দিবে।
- কোনো একটা ক্যারেক্টারও যদি ভিন্ন হয় তাহলে Hashing এলগোরিদমের digest ভিন্ন হবে।
বুঝতেই পারছেন, আপনার কোনো চালাক স্টুডেন্ট যদি তাদের এসাইনমেন্টে বুদ্ধি করে সামান্য এদিক ওদিক করে দেয় তাহলে আপনার পদ্ধতি তাঁদেরকে আটকাতে পারবে না। যদিও আমাদের এই প্রেক্ষাপটে Hashing ব্যবহার করা খুব ভালো সলিউশন হচ্ছে না, কিন্তু অন্য আরো অনেক ক্ষেত্রে এর বেশ ভালো ব্যবহার আছে। মূল ব্যাপার হচ্ছে Data Integrity চেক করার জন্য Hashing হচ্ছে বেশ ভালো পদ্ধতি। Hashing এর আরো কিছু উল্লেখযোগ্য ব্যাপার আছে যেগুলো মনে রাখা জরুরী-
- Encryption এর ক্ষেত্রে যেমন কোনো ডাটাকে এনক্রিপ্ট করার পর সেটাকে আবার ডিক্রিপ্ট করে আগের অবস্থায় ফিরে পাওয়া যায়, Hashing এর ক্ষেত্রে সেটি সম্ভব না। অর্থাৎ Hashing এ পাওয়া Digest থেকে তাঁর ইনপুট ডাটায় ফেরত যাওয়া যায় না।
- ইনপুট ডাটায় সামান্য পরিবর্তনেও Digest এ অনেক বেশী পরিবর্তন হয়ে যায়। এর সুবিধা হলো আপনি কোনো একটা Digest দেখে ভিন্ন ভিন্ন ইনপুট দিয়ে চেষ্টা করে ঐ Digest এর ইনপুট আন্দাজ করে বের করতে পারবেন না। অর্থাৎ ইনপুটের উপর ভিত্তি করে Digest এর কোনো নির্দিষ্ট প্যাটার্ন পাওয়া যায় না।
মনে হতে পারে যে, আমি যদি কোনো ডাটা হ্যাশ থেকে আগের ডাটায় ফিরেই যেতে না পারি তাহলে হ্যাশিং আসলেই কি কাজে লাগবে? আসলে Encryption যেমন ডাটা গোপন রাখার ক্ষেত্রে মূখ্য ভূমিকা পালন করে তেমনি Hashing ডাটায় কোনো পরিবর্তন হলো কিনা সেটা সিদ্ধান্ত নিতে সাহায্য করে। এজন্য যেসব প্রেক্ষাপটে আপনার হয়তো মূল ডাটা স্টোর করে রাখার দরকার নেই, শুধু নতুন ডাটা আগের ডাটার মত একই কিনা সেটা চেক করা লাগবে এসব ক্ষেত্রে Hashing খুব কাজের। যেমন ডাটাবেজে পাসওয়ার্ড সেভ করে রাখার ক্ষেত্রে আপনার মূল পাসওয়ার্ড সেভ না করে শুধুমাত্র সেটার হ্যাশ ভ্যালু রেখে দিলেই চলে, তাই না? হ্যাশিং নিয়ে আরো বিস্তারিত এবং কীভাবে ডাটাবেজে হ্যাশ করে পাসওয়ার্ড রাখা হয় তা নিয়ে এই লেখাটিতে চমৎকার বর্ণনা দেয়া হয়েছে।
স্ট্রিং ম্যাচিং, প্যাটার্ন ম্যাচিং, সিকিউরিটি এলগোরিদমগুলোতে Hashing টেকনিক বহুলভাবে ব্যবহৃত হয়। উল্লেখযোগ্য Hashing মেথডগুলোর মধ্যে আছে SHA-1, SHA-3, MD5 ইত্যাদি।
আজ এ পর্যন্তই। আশা করি কিছুটা হলেও বিষয়গুলো সম্পর্কে ধারণা দিতে পেরেছি। যে কোনো প্রশ্ন বা ভুল ধরিয়ে দিতে কমেন্ট করুন। ধন্যবাদ। :)