SHA-1, SHA-256, SHA-384 বা SHA-512 ব্যবহার করে যেকোনো বার্তা এবং সিক্রেটের জন্য একটি HMAC স্বাক্ষর গণনা করুন, হেক্স, base64 বা base64url আউটপুট সহ।
মেসেজ অথেনটিকেশন কোড, স্থানীয়ভাবে। HMAC একটি হ্যাশ ফাংশনকে একটি সিক্রেট কী-এর সাথে একত্রিত করে, যাতে প্রাপক ইন্টিগ্রিটি এবং প্রামাণিকতা উভয়ই যাচাই করতে পারেন। Web Crypto API দিয়ে আপনার ব্রাউজারে গণনা করা হয়।
HMAC কী কাজে লাগে
অথেনটিকেশন, এনক্রিপশন নয়
একটি HMAC কিছুই গোপন করে না। এটি একটি ভিন্ন প্রশ্নের উত্তর দেয়: এই নির্দিষ্ট বার্তাটি কি শেয়ার্ড সিক্রেটের অধিকারী কেউ তৈরি করেছে, এবং তারপর থেকে এটি কি পরিবর্তিত হয়েছে? আউটপুট হল একটি নির্দিষ্ট আকারের ট্যাগ যা আপনি বার্তার সাথে পাঠান; প্রাপক একই কী দিয়ে এটি পুনরায় গণনা করে এবং তুলনা করে। মিলে যাওয়া ট্যাগ মানে বার্তাটি প্রামাণিক এবং অক্ষত। মিল না হওয়া ট্যাগ মানে এটি দুটোই নয়, এবং কোনটি তা বলার কোনো উপায় নেই।
এটি HMAC-কে ওয়েবহুক স্বাক্ষর, API রিকোয়েস্ট স্বাক্ষর, সাইনড কুকি এবং সেশন টোকেনের মূল চালিকাশক্তি করে তোলে। Stripe, GitHub এবং বেশিরভাগ ওয়েবহুক প্রদানকারী এইভাবে তাদের পেলোডে স্বাক্ষর করে, যাতে আপনি যাচাই করতে পারেন একটি রিকোয়েস্ট সত্যিই তাদের কাছ থেকে এসেছে, আপনার এন্ডপয়েন্ট URL অনুমান করা কারো কাছ থেকে নয়।
কী এবং বার্তা একসাথে হ্যাশ করলেই হয় না কেন
সুস্পষ্ট নির্মাণটি — SHA256(key + message) — SHA-1 এবং SHA-256-এর মতো Merkle-Damgard হ্যাশের বিরুদ্ধে ভাঙা। এই হ্যাশগুলো ডেটা ব্লকে প্রসেস করে এবং স্টেট সামনে বহন করে, তাই একজন আক্রমণকারী যিনি একটি বৈধ ডাইজেস্ট জানেন, তিনি কী কখনো না জেনেই বার্তার শেষে ডেটা যোগ করে বর্ধিত বার্তার জন্য বৈধ ডাইজেস্ট গণনা করতে পারেন। এটিই লেংথ-এক্সটেনশন আক্রমণ, এবং এটি তাত্ত্বিক নয়; এটি বাস্তব API ভেঙেছে।
HMAC-এর নেস্টেড নির্মাণ, H(key XOR opad || H(key XOR ipad || message)), সেই ফাঁক বন্ধ করে। ভিন্ন প্যাডেড কী দিয়ে দুটি পাস মানে চূড়ান্ত ডাইজেস্ট আক্রমণকারী-প্রভাবিত ডেটার উপর হ্যাশের কাঁচা অভ্যন্তরীণ স্টেট নয়। এ কারণেই আপনার নিজস্ব কিয়েড হ্যাশ উদ্ভাবনের বদলে সবসময় HMAC ব্যবহার করা উচিত।
ব্যবহারিক নোট
বাইরের কিছু বাধ্য না করলে SHA-256 বেছে নিন। SHA-1 এখনও HMAC-এর ভিতরে নিরাপদ কারণ নির্মাণটি কলিশন রেজিস্ট্যান্সের উপর নির্ভর করে না, কিন্তু নতুন সিস্টেমের এটি ব্যবহারের কোনো কারণ নেই এবং নিরীক্ষকরা এটিকে চিহ্নিত করবেন। SHA-512 এই উদ্দেশ্যে অর্থবহভাবে শক্তিশালী নয় এবং 64-বিট হার্ডওয়্যারে কখনো কখনো দ্রুততর।
হ্যাশ পছন্দের চেয়ে দুটি বাস্তবায়ন বিবরণ বেশি গুরুত্বপূর্ণ। প্রথমত, ট্যাগগুলো ধ্রুবক সময়ে তুলনা করুন — একটি সাধারণ স্ট্রিং তুলনা প্রথম ভিন্ন বাইটেই তাড়াতাড়ি ফিরে আসে, যা একটি করে বাইট ট্যাগ জাল করার জন্য যথেষ্ট টাইমিং তথ্য ফাঁস করে। দ্বিতীয়ত, কীগুলো অন্তত ডাইজেস্ট দৈর্ঘ্যের র্যান্ডম বাইট হওয়া উচিত, মনে রাখার মতো পাসফ্রেজ নয়; HMAC কী পাসওয়ার্ড হ্যাশ নয় এবং কোনো স্ট্রেচিং পায় না।
FAQ
আমার সিক্রেট কি কোথাও পাঠানো হয়?
না। কী এবং বার্তা কখনো আপনার ব্রাউজার ছেড়ে যায় না; স্বাক্ষরটি Web Crypto API দিয়ে স্থানীয়ভাবে গণনা করা হয় এবং কিছুই ট্রান্সমিট বা সংরক্ষিত হয় না।
আমার কোন অ্যালগরিদম বেছে নেওয়া উচিত?
নতুন কাজের জন্য SHA-256 ব্যবহার করুন। SHA-384 এবং SHA-512 অল্প খরচে নিরাপত্তার মার্জিন বাড়ায়; SHA-1 শুধু লিগ্যাসি সিস্টেমের সাথে ইন্টারঅপারেবিলিটির জন্য বিদ্যমান।
base64 এবং base64url-এর মধ্যে পার্থক্য কী?
Base64url + এবং / এর জায়গায় - এবং _ বসায় এবং প্যাডিং বাদ দেয়, যার ফলে ফলাফলটি URL, ফাইলনাম এবং HTTP হেডারে রাখার জন্য নিরাপদ হয়।
HMAC কি একধরনের এনক্রিপশন?
না। এটি প্রমাণ করে বার্তাটি কী-এর অধিকারী কারো কাছ থেকে এসেছে এবং পরিবর্তিত হয়নি, কিন্তু বার্তাটি নিজেই সম্পূর্ণ পাঠযোগ্য থাকে। গোপনীয়তারও প্রয়োজন হলে TLS বা এনক্রিপশন যোগ করুন।
কী এবং বার্তা একসাথে হ্যাশ করলেই হয় না কেন?
সাধারণ SHA-2 লেংথ এক্সটেনশনের ঝুঁকিতে রয়েছে: একজন আক্রমণকারী স্বাক্ষরিত বার্তায় ডেটা যোগ করতে পারে এবং কী না জেনেই একটি বৈধ ডাইজেস্ট জাল করতে পারে। HMAC-এর নেস্টেড নির্মাণ এটি আটকায়।
কোডে আমার দুটি HMAC কীভাবে তুলনা করা উচিত?
crypto.timingSafeEqual-এর মতো একটি কনস্ট্যান্ট-টাইম তুলনার মাধ্যমে। একটি সাধারণ == প্রথম ভিন্ন বাইটেই বের হয়ে যায়, যা একটি করে বাইট সঠিক ট্যাগ ফাঁস করতে পারে।