HMAC को संदेश के साथ कुंजी भी चाहिए

साधारण SHA-256 संदेश के बाइट का हैश बनाता है। HMAC-SHA-256 कुंजी और संदेश से प्रमाणीकरण मान गणना करता है। RFC 2104 की रचना केवल संदेश के आगे कुंजी जोड़कर हैश बनाना नहीं है। बिना कुंजी के हैश का मिलना अकेले प्रेषक को प्रमाणित नहीं करता।

SHA-256 को संदेश मिलता है; HMAC-SHA-256 को कुंजी और संदेश। दोनों आउटपुट 256 बिट हैं
M संदेश और K कुंजी है। इनपुट का स्वयं बनाया अवधारणा आरेख। समान लंबाई का अर्थ समान मान या कार्य नहीं है।

RFC 2104 §2: HMAC

RFC टेस्ट कुंजी को बाइट में दोहराएँ

RFC 4231 का टेस्ट 1 बीस 0x0b बाइट और Hi There संदेश उपयोग करता है। नीचे का कोड Web Crypto HMAC कुंजी आयात करके परिणाम हेक्साडेसिमल में दिखाता है। 0b टेक्स्ट बीस बार दोहराने से 40 बाइट का अलग इनपुट बनता है। यह सार्वजनिक टेस्ट कुंजी है, उत्पादन की गुप्त कुंजी नहीं।

Moyoutil साधारण SHA हैश गणना करता है और HMAC इनपुट नहीं देता। नीचे अलग JavaScript उदाहरण है, संपूर्ण लॉगिन या वेबहुक सत्यापन प्रणाली नहीं। वास्तविक प्रमाणीकरण में गुप्त कुंजी की सुरक्षा और सही सत्यापन प्रक्रिया चाहिए।

const hex = bytes => Array.from(new Uint8Array(bytes),
  n => n.toString(16).padStart(2, '0')).join('');
const keyBytes = new Uint8Array(20).fill(0x0b);
const message = new TextEncoder().encode('Hi There');
const key = await crypto.subtle.importKey(
  'raw', keyBytes, {name:'HMAC', hash:'SHA-256'},
  false, ['sign']);
const mac = await crypto.subtle.sign('HMAC', key, message);
console.log(hex(mac));
// b0344c61d8db38535ca8afceaf0bf12b
// 881dc200c9833da726e9376c2e32cff7

RFC 4231 §4.2: Test Case 1

W3C Web Cryptography: HMAC

अक्सर पूछे जाने वाले प्रश्न

क्या दोनों नामों में SHA-256 होने से परिणाम तुलना कर सकते हैं?

साधारण SHA-256 और HMAC-SHA-256 को न मिलाएँ। HMAC तुलना में समान कुंजी बाइट, संदेश बाइट और एल्गोरिदम चाहिए। हेक्साडेसिमल और Base64 जैसे आउटपुट प्रारूप भी अलग समझें।