अपडेट करें:
मैंने अपने अन्य उत्तर में यह लिंक जोड़ा है कि कैसे JWT में रुचि रखने वाले किसी भी व्यक्ति के लिए ASP.NET वेब एपीआई के लिए JWT प्रमाणीकरण का उपयोग करें।
हम वेब एपीआई को सुरक्षित करने के लिए HMAC प्रमाणीकरण लागू करने में कामयाब रहे हैं, और यह ठीक काम किया है। एचएमएसी प्रमाणीकरण प्रत्येक उपभोक्ता के लिए एक गुप्त कुंजी का उपयोग करता है जो उपभोक्ता और सर्वर दोनों को एक संदेश हैश करने के लिए जानते हैं, एचएमएसी 256 का उपयोग किया जाना चाहिए। अधिकांश मामलों में, उपभोक्ता का हैशेड पासवर्ड एक गुप्त कुंजी के रूप में उपयोग किया जाता है।
संदेश सामान्यतः HTTP अनुरोध में डेटा से बनाया गया है, या यहां तक कि अनुकूलित डेटा जो HTTP हेडर में जोड़ा गया है, संदेश में शामिल हो सकता है:
- टाइमस्टैम्प: अनुरोध भेजने का समय (UTC या GMT)
- HTTP वर्ब: GET, POST, PUT, DELETE।
- पोस्ट डेटा और क्वेरी स्ट्रिंग,
- यूआरएल
हुड के तहत, एचएमएसी प्रमाणीकरण होगा:
उपभोक्ता हस्ताक्षर (hmac हैश का आउटपुट), HTTP अनुरोध के टेम्पलेट के निर्माण के बाद, वेब सर्वर पर एक HTTP अनुरोध भेजता है:
User-Agent: {agent}
Host: {host}
Timestamp: {timestamp}
Authentication: {username}:{signature}
GET अनुरोध के लिए उदाहरण:
GET /webapi.hmac/api/values
User-Agent: Fiddler
Host: localhost
Timestamp: Thursday, August 02, 2012 3:30:32 PM
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
हस्ताक्षर प्राप्त करने के लिए हैश करने का संदेश:
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
क्वेरी स्ट्रिंग के साथ POST अनुरोध के लिए उदाहरण (नीचे हस्ताक्षर सही नहीं है, सिर्फ एक उदाहरण)
POST /webapi.hmac/api/values?key2=value2
User-Agent: Fiddler
Host: localhost
Content-Type: application/x-www-form-urlencoded
Timestamp: Thursday, August 02, 2012 3:30:32 PM
Authentication: cuongle:LohrhqqoDy6PhLrHAXi7dUVACyJZilQtlDzNbLqzXlw=
key1=value1&key3=value3
हस्ताक्षर प्राप्त करने के लिए हैश करने का संदेश
GET\n
Thursday, August 02, 2012 3:30:32 PM\n
/webapi.hmac/api/values\n
key1=value1&key2=value2&key3=value3
कृपया ध्यान दें कि फॉर्म डेटा और क्वेरी स्ट्रिंग क्रम में होनी चाहिए, इसलिए सर्वर पर कोड को क्वेरी स्ट्रिंग और सही संदेश बनाने के लिए डेटा फॉर्म मिलता है।
जब HTTP अनुरोध सर्वर पर आता है, तो सूचना प्राप्त करने के लिए अनुरोध को पार्स करने के लिए एक प्रमाणीकरण क्रिया फ़िल्टर लागू किया जाता है: HTTP क्रिया, टाइमस्टैम्प, uri, फॉर्म डेटा और क्वेरी स्ट्रिंग, फिर गुप्त के साथ हस्ताक्षर (hmac हैश का उपयोग करने के लिए) पर आधारित कुंजी (हैशेड पासवर्ड) सर्वर पर।
गुप्त कुंजी डेटाबेस से उपयोगकर्ता नाम के साथ अनुरोध पर मिलती है।
फिर सर्वर कोड निर्मित हस्ताक्षर के साथ अनुरोध पर हस्ताक्षर की तुलना करता है; यदि बराबर है, तो प्रमाणीकरण पारित किया जाता है, अन्यथा, यह विफल रहा।
हस्ताक्षर बनाने का कोड:
private static string ComputeHash(string hashedPassword, string message)
{
var key = Encoding.UTF8.GetBytes(hashedPassword.ToUpper());
string hashString;
using (var hmac = new HMACSHA256(key))
{
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(message));
hashString = Convert.ToBase64String(hash);
}
return hashString;
}
तो, रिप्ले हमले को कैसे रोकें?
टाइमस्टैम्प के लिए बाधा जोड़ें, कुछ इस तरह:
servertime - X minutes|seconds <= timestamp <= servertime + X minutes|seconds
(सर्वरटाइम: सर्वर पर आने वाले अनुरोध का समय)
और, मेमोरी में अनुरोध के हस्ताक्षर को कैश करें (मेमोरीकाच का उपयोग करें, समय की सीमा में रखना चाहिए)। यदि अगला अनुरोध पिछले अनुरोध के साथ समान हस्ताक्षर के साथ आता है, तो इसे अस्वीकार कर दिया जाएगा।
डेमो कोड यहां दिया गया है:
https://github.com/cuongle/Hmac.WebApi