হালনাগাদ:
আমি JWT- এ আগ্রহী যে কেউ এখানে ASP.NET ওয়েব API এর জন্য JWT প্রমাণীকরণটি কীভাবে ব্যবহার করতে হয় তা আমার অন্য উত্তরের সাথে এই লিঙ্কটি যুক্ত করেছি ।
ওয়েব এপিআই সুরক্ষিত করার জন্য আমরা এইচএমএসি প্রমাণীকরণ প্রয়োগ করতে পেরেছি এবং এটি ঠিক আছে। এইচএমএসি প্রমাণীকরণ প্রতিটি গ্রাহকের জন্য একটি গোপন কী ব্যবহার করে যা গ্রাহক এবং সার্ভার উভয়ই হ্যাশ করতে একটি বার্তা জানতে জানে, এইচএমএসি 256 ব্যবহার করা উচিত। বেশিরভাগ ক্ষেত্রে গ্রাহকের হ্যাশ পাসওয়ার্ড একটি গোপন কী হিসাবে ব্যবহৃত হয়।
বার্তাটি সাধারণত HTTP অনুরোধের ডেটা থেকে তৈরি করা হয়, বা এমনকী কাস্টমাইজড ডেটা যা HTTP শিরোনামে যুক্ত হয়, বার্তায় অন্তর্ভুক্ত থাকতে পারে:
- টাইমস্ট্যাম্প: অনুরোধটি প্রেরণের সময় (ইউটিসি বা জিএমটি)
- HTTP ক্রিয়া: GET, POST, PUT, DELETE।
- পোস্ট ডেটা এবং কোয়েরি স্ট্রিং,
- URL টি
ফণা অধীনে, এইচএমএসি প্রমাণীকরণ হবে:
গ্রাহক ওয়েব সার্ভারে এইচটিটিপি অনুরোধ প্রেরণ করে, স্বাক্ষর তৈরির পরে (এইচএমএসি হ্যাশের আউটপুট), এইচটিটিপি অনুরোধের টেম্পলেট:
User-Agent: {agent}
Host: {host}
Timestamp: {timestamp}
Authentication: {username}:{signature}
জিইটি অনুরোধের উদাহরণ:
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 /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 অনুরোধটি সার্ভারে আসে, তথ্যের জন্য অনুরোধটিকে বিশ্লেষণের জন্য একটি প্রমাণীকরণ ক্রিয়া ফিল্টার প্রয়োগ করা হয়: এইচটিটিপি ক্রিয়া, টাইমস্ট্যাম্প, ইউরি, ফর্ম ডেটা এবং ক্যোয়ারিং স্ট্রিং, তারপরে স্বাক্ষরের সাথে স্বাক্ষর তৈরি করতে এইচএমসি হ্যাশ ব্যবহার করুন) সার্ভারে কী (হ্যাশ পাসওয়ার্ড)।
অনুরোধে ব্যবহারকারীর নাম সহ ডাটাবেস থেকে গোপন কীটি পাওয়া যায়।
তারপরে সার্ভার কোড অনুরোধে স্বাক্ষরের সাথে স্বাক্ষরের সাথে তুলনা করে; যদি সমান হয় তবে প্রমাণীকরণটি পাস হয়ে যায়, অন্যথায় এটি ব্যর্থ হয়।
স্বাক্ষর তৈরির কোড:
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