HMAC क्या है?
HMAC (hash-based message authentication code) एक सीक्रेट की को SHA-256 जैसे हैश फ़ंक्शन के साथ जोड़कर एक टैग बनाता है जो साबित करता है कि मैसेज की रखने वाले ने बनाया और बाद में बदला नहीं गया। यही HS256 JWT और ज़्यादातर वेबहुक पेलोड पर हस्ताक्षर करता है; इसे सत्यापित करने का मतलब है उसी की से दोबारा गणना और कॉन्स्टेंट-टाइम तुलना।
प्रोवाइडर साइन करता है
- 1शेयर्ड सीक्रेट से कच्ची बॉडी का HMACआमतौर पर HMAC-SHA256; Stripe
timestamp.rawBodyसाइन करता है - 2बॉडी और सिग्नेचर हेडर भेजता है
X-Hub-Signature-256: sha256=<hex>
आप डिलीवरी जाँचते हैं
- 3ठीक उन्हीं कच्चे बाइट पर दोबारा गणनाकच्ची बॉडी, सही Key encoding में सीक्रेट, और Stripe के लिए टाइमस्टैम्प फ़ील्ड में
tवैल्यूयह टूल - 4प्राप्त सिग्नेचर से तुलना
sha256=याv1=के साथ या बिना पेस्ट करें: मेल खाता है या नहींयह टूलशाखा: बॉडी दोबारा सीरियलाइज़, ग़लत Key encoding, टाइमस्टैम्प प्रीफ़िक्स छूटा, या अंत में न्यूलाइनफ़ेल
- प्रोडक्शन में: आपका सर्वरहर डिलीवरी पर चरण 3 और 4 दोहराता है और constant-time तुलना करता है
HMAC जनरेटर कैसे इस्तेमाल करें
- ठीक वही कच्ची रिक्वेस्ट बॉडी या मैसेज पेस्ट करें।
- सीक्रेट डालें और उसकी एन्कोडिंग चुनें (टेक्स्ट, hex या Base64)।
- वही एल्गोरिदम चुनें जो आपका प्रोवाइडर इस्तेमाल करता है (आमतौर पर HMAC-SHA256)।
- चाहें तो प्रोवाइडर के हेडर से टाइमस्टैम्प जोड़ें और वेरिफ़ाई करने के लिए प्राप्त सिग्नेचर पेस्ट करें।
- सिग्नेचर को hex या Base64 में कॉपी करें।
HMAC जनरेटर की खूबियाँ
- WebCrypto से HMAC-SHA256, SHA-1, SHA-384 और SHA-512
- की UTF-8 टेक्स्ट, hex या Base64 बाइट के रूप में
- Stripe शैली का वैकल्पिक "timestamp.payload" साइनिंग इनपुट
- प्राप्त सिग्नेचर वेरिफ़ाई करें (sha256=, v1= प्रीफ़िक्स, hex या Base64 स्वीकार करता है)
- GitHub, Shopify और Stripe वेबहुक के लिए तैयार हेडर फ़ॉर्मेट
- सीक्रेट कभी ब्राउज़र से बाहर नहीं जाते
HMAC जनरेटर का उदाहरण
क्लासिक टेस्ट वेक्टर के साथ HMAC-SHA256
इनपुट:
Message: The quick brown fox jumps over the lazy dog
Key: keyआउटपुट:
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8HMAC जनरेटर के बारे में अक्सर पूछे जाने वाले सवाल
Stripe वेबहुक सिग्नेचर कैसे वेरिफ़ाई करूँ?
Stripe आपके एंडपॉइंट सीक्रेट से "timestamp.rawBody" को HMAC-SHA256 से साइन करता है। कच्ची रिक्वेस्ट बॉडी पेस्ट करें, सीक्रेट डालें, Stripe-Signature हेडर की t वैल्यू टाइमस्टैम्प फ़ील्ड में रखें और नतीजे की तुलना v1 वैल्यू से करें।
GitHub वेबहुक कैसे वेरिफ़ाई करूँ?
GitHub, X-Hub-Signature-256: sha256=<hex> भेजता है। वेबहुक सीक्रेट से कच्ची बॉडी का HMAC-SHA256 निकालें और hex आउटपुट से तुलना करें; टूल "sha256=" प्रीफ़िक्स अपने आप हटा देता है।
मेरा सिग्नेचर मेल क्यों नहीं खा रहा?
आमतौर पर इसलिए कि बॉडी दोबारा सीरियलाइज़ हो गई (स्पेस या कीज़ का क्रम बदल गया), की Base64/hex थी पर उसे टेक्स्ट माना गया, टाइमस्टैम्प प्रीफ़िक्स छूट गया, या अंत में एक न्यूलाइन जुड़ गई। हमेशा ठीक वही कच्चे बाइट साइन करें।
की hex में हो, Base64 में या टेक्स्ट?
जैसी प्रोवाइडर देता है वैसी। Shopify और GitHub के सीक्रेट सादे टेक्स्ट होते हैं; कुछ API Base64 की देते हैं। सही बाइट पाने के लिए उससे मेल खाती "Key encoding" चुनें।
HMAC आख़िर है क्या?
HMAC (RFC 2104) एक सीक्रेट की को हैश फ़ंक्शन के साथ इस तरह जोड़ता है कि सिर्फ़ की रखने वाले पक्ष ही टैग बना या जाँच सकें। की+मैसेज के सादे हैश के विपरीत, यह length-extension हमलों के प्रति संवेदनशील नहीं है।
तकनीकी नोट्स
HMAC (RFC 2104) H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)) की गणना करता है। हैश ब्लॉक साइज़ से लंबी कीज़ को पहले हैश किया जाता है; छोटी कीज़ में शून्य पैडिंग जोड़ी जाती है। टूल की को crypto.subtle.importKey से इम्पोर्ट करता है और crypto.subtle.sign से साइन करता है, इसलिए एक ही कच्चे बाइट साइन करने पर नतीजा सर्वर-साइड लाइब्रेरियों से बाइट-दर-बाइट मेल खाता है।
संदर्भ
- RFC 2104: HMAC: Keyed-Hashing for Message AuthenticationHMAC संरचना: एक सीक्रेट की और हैश फ़ंक्शन मिलकर मैसेज ऑथेंटिकेशन कोड कैसे बनाते हैं।
- FIPS 198-1: The Keyed-Hash Message Authentication Code (HMAC)HMAC का NIST मानक, की-लंबाई और ट्रंकेशन मार्गदर्शन सहित।
- RFC 6234: US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)SHA-1, SHA-224/256/384/512 और HMAC में उनके उपयोग के संदर्भ विवरण और कोड।