HMAC জেনারেটর
SHA-256, SHA-384 বা SHA-512 দিয়ে HMAC স্বাক্ষর তৈরি করুন
বার্তা
গোপন কী
HMAC স্বাক্ষর
HMAC স্বাক্ষর এখানে দেখাবে…
HMAC কী?
HMAC (Hash-based Message Authentication Code) হলো RFC 2104-এ সংজ্ঞায়িত একটি ক্রিপ্টোগ্রাফিক কনস্ট্রাকশন যা একটি হ্যাশ ফাংশনকে একটি গোপন কী-এর সাথে মিলিয়ে একটি নির্দিষ্ট আকারের প্রমাণীকরণ ট্যাগ তৈরি করে। সাধারণ হ্যাশের মতো নয়, যা যে কেউ গণনা করতে পারে — HMAC কেবল তাদের দ্বারা তৈরি ও যাচাই করা যায় যারা গোপন কীটি ভাগ করে নেয়। HMAC হলো একটি বার্তার অখণ্ডতা ও সত্যতা উভয়ই যাচাই করার মানক পদ্ধতি — এটি নিশ্চিত করে যে তথ্য পরিবর্তিত হয়নি এবং একটি বিশ্বস্ত প্রেরক দ্বারা তৈরি হয়েছে।
HMAC অ্যালগরিদম যেকোনো পুনরাবৃত্তিমূলক হ্যাশ ফাংশনের সাথে কাজ করে: SHA-256, SHA-384, SHA-512 এবং এমনকি পুরনো SHA-1 বা MD5। ফলস্বরূপ কনস্ট্রাকশনকে এর অন্তর্নিহিত হ্যাশ দ্বারা চিহ্নিত করা হয় — HMAC-SHA256, HMAC-SHA384 বা HMAC-SHA512। যেহেতু HMAC-এর নিরাপত্তা প্রমাণ হ্যাশ ফাংশনটির collision-resistant হওয়া এবং কিছু pseudorandom বৈশিষ্ট্য থাকার উপর নির্ভর করে, তাই SHA-2 পরিবারের অ্যালগরিদমগুলো নতুন সিস্টেমের জন্য প্রস্তাবিত পছন্দ। HMAC-SHA256 সর্বাধিক ব্যবহৃত ভ্যারিয়েন্ট — AWS Signature V4, Stripe webhooks, GitHub webhook secrets, Slack request signing এবং JSON Web Tokens (HS256)-এ ব্যবহৃত হয়।
HMAC-এর ডিজাইনে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে যা সাধারণ হ্যাশিংয়ে নেই: length-extension আক্রমণের বিরুদ্ধে প্রতিরোধ। শুধু SHA-256 দিয়ে, যে আক্রমণকারী H(message) জানে সে মূল বার্তা না জেনেই H(message || attacker_data) গণনা করতে পারে। HMAC-এর দ্বি-হ্যাশিং কাঠামো (ভিন্ন প্যাডেড কী সহ ভেতরের হ্যাশ ও বাইরের হ্যাশ) এই আক্রমণ সম্পূর্ণরূপে প্রতিরোধ করে। এ কারণেই API স্বাক্ষর স্কিমগুলো বার্তায় গোপন কী যুক্ত করে হ্যাশ করার পরিবর্তে HMAC ব্যবহার করে।
অনলাইন HMAC জেনারেটর কেন ব্যবহার করবেন?
HMAC স্বাক্ষর গণনা করতে সাধারণত কোড লেখা বা CLI টুল ব্যবহার করতে হয়। এই ব্রাউজার-ভিত্তিক HMAC জেনারেটর আপনাকে কোনো সফটওয়্যার ইনস্টল বা টার্মিনালে না গিয়েই তাৎক্ষণিকভাবে HMAC-SHA256, HMAC-SHA384 ও HMAC-SHA512 স্বাক্ষর তৈরি করতে দেয়।
HMAC জেনারেটরের ব্যবহারের ক্ষেত্র
HMAC বনাম সাধারণ হ্যাশ বনাম এনক্রিপশন
HMAC, সাধারণ হ্যাশিং ও এনক্রিপশন ভিন্ন ভিন্ন উদ্দেশ্যে কাজ করে। HMAC বার্তার প্রমাণীকরণ প্রদান করে — প্রমাণ যে বার্তাটি গোপন কী-সম্পন্ন কেউ তৈরি করেছে এবং এটি পরিবর্তিত হয়নি। সাধারণ হ্যাশ অখণ্ডতা প্রদান করে কিন্তু প্রমাণীকরণ নয়। এনক্রিপশন গোপনীয়তা প্রদান করে। নিচের সারণি পার্থক্যগুলো স্পষ্ট করে।
| বৈশিষ্ট্য | HMAC | Plain Hash | Encryption |
|---|---|---|---|
| Purpose | Message authentication + integrity | Data integrity only (no key) | Confidentiality + integrity |
| Requires secret key | Yes | No | Yes |
| Verifiable by | Parties who share the secret | Anyone | Recipient with key |
| Reversible | No — digest only | No — digest only | Yes — decryption recovers data |
| Output size | Depends on hash (e.g. 256 bits) | Depends on hash | Variable (ciphertext) |
| Standard | RFC 2104 | FIPS 180-4 | NIST SP 800-38A (AES) |
| Use case example | Webhook signature verification | File checksum verification | Encrypting data at rest |
HMAC অ্যালগরিদম তুলনা
HMAC যেকোনো হ্যাশ ফাংশন ব্যবহার করতে পারে, তবে অন্তর্নিহিত অ্যালগরিদমের পছন্দ আউটপুটের আকার, নিরাপত্তার মাত্রা ও ব্রাউজার সামঞ্জস্যতা নির্ধারণ করে। নতুন সিস্টেমের জন্য HMAC-SHA256 সবচেয়ে সাধারণ পছন্দ। নিচের সারণি আপনি যে ভ্যারিয়েন্টগুলো সম্মুখীন হতে পারেন তা তুলনা করে।
| অ্যালগরিদম | ডাইজেস্টের আকার | হেক্সের দৈর্ঘ্য | ওয়েব ক্রিপ্টো | সবচেয়ে উপযুক্ত |
|---|---|---|---|---|
| HMAC-SHA256 | 256 bits | 64 hex chars | Yes | API signing, webhooks, JWT (HS256) |
| HMAC-SHA384 | 384 bits | 96 hex chars | Yes | TLS 1.3 PRF, CNSA compliance |
| HMAC-SHA512 | 512 bits | 128 hex chars | Yes | High-security signatures, HKDF |
| HMAC-SHA1 | 160 bits | 40 hex chars | Yes | Legacy OAuth 1.0, TOTP (RFC 6238) |
| HMAC-MD5 | 128 bits | 32 hex chars | No | Legacy only — not recommended |
HMAC অভ্যন্তরীণভাবে কীভাবে কাজ করে
HMAC অন্তর্নিহিত হ্যাশ ফাংশনটি দুটি ভিন্ন কী-ডেরাইভড প্যাড দিয়ে দুইবার প্রয়োগ করে। কনস্ট্রাকশনটি RFC 2104-এ সংজ্ঞায়িত এবং মানক ক্রিপ্টোগ্রাফিক অনুমানের অধীনে PRF (pseudorandom function) হিসেবে প্রমাণিত। কীটি প্রথমে প্যাড করা হয় বা হ্যাশ ফাংশনের ব্লক আকারের সাথে মেলাতে হ্যাশ করা হয় (SHA-256-এর জন্য 64 বাইট, SHA-512-এর জন্য 128 বাইট)।
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
অ্যালগরিদমটি প্যাডেড কীকে একটি ভেতরের প্যাড কনস্ট্যান্ট (ipad, 0x36 বারবার) দিয়ে XOR করে, বার্তার সাথে যুক্ত করে এবং ফলাফল হ্যাশ করে। তারপর প্যাডেড কীকে একটি বাইরের প্যাড কনস্ট্যান্ট (opad, 0x5C বারবার) দিয়ে XOR করে, ভেতরের হ্যাশ আউটপুটের সাথে যুক্ত করে এবং আবার হ্যাশ করে। এই দ্বি-হ্যাশিং কাঠামোই length-extension আক্রমণ প্রতিরোধ করে এবং নিশ্চিত করে যে গোপন কী-এর জ্ঞান ছাড়া HMAC আউটপুট গণনা করা যায় না।
HMAC কোডের উদাহরণ
HMAC প্রতিটি প্রধান ভাষা ও রানটাইমে নেটিভলি সমর্থিত। Web Crypto API কোনো লাইব্রেরি ছাড়াই ব্রাউজারে HMAC-SHA256, HMAC-SHA384 ও HMAC-SHA512 সরবরাহ করে। নিচের উদাহরণগুলো webhook যাচাইকরণ ও constant-time তুলনাসহ বাস্তব ব্যবহারের ধরন দেখায়।
async function hmacSHA256(message, secret) {
const enc = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw', enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false, ['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
return Array.from(new Uint8Array(sig))
.map(b => b.toString(16).padStart(2, '0')).join('')
}
await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
.update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"import hmac
import hashlib
# HMAC-SHA256
sig = hmac.new(
b'my-secret-key',
b'hello world',
hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
print("Signature valid")
# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()package main
import (
"crypto/hmac"
"crypto/sha256"
"fmt"
)
func main() {
mac := hmac.New(sha256.New, []byte("my-secret-key"))
mac.Write([]byte("hello world"))
sig := mac.Sum(nil)
fmt.Printf("%x\n", sig)
// → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad
// Verify: use hmac.Equal for constant-time comparison
expected := mac.Sum(nil)
fmt.Println(hmac.Equal(sig, expected)) // true
}# HMAC-SHA256 echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key" # → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad # HMAC-SHA512 echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key" # Verify a file signature openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz # HMAC with hex key (e.g. from a webhook secret) echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"