رمز مصادقة الرسالة المستند إلى التجزئة (HMAC) هو آلية لحساب رمز مصادقة الرسالة الذي يتضمن وظيفة تجزئة مع مفتاح سري. يمكن استخدام هذا للتحقق من سلامة وصحة رسالة aa.
هذا التنفيذ مستوحى بشكل كبير من طريقة المصادقة الرئيسية التي تستخدمها Amazon Web Services (AWS Signature V4) لأنها مفهومة جيدًا، وهناك عدد من المكتبات التي تنفذها. لاستخدام هذا النوع من المصادقة، يمكنك استخدام معرف رئيسي ومفتاح سري، ويتم إنشاءهما عادةً في واجهة المسؤول.
يوفر HmacAuthentication AuthenticationHandler
الذي يدعم مصادقة HMAC في مشروع ASP.NET Core.
الاستخدام:
appsettings.json
. بالنسبة لمصادقة HMAC، يلزم وجود AppId
ومفتاح ApiKey
لكل عميل يجب أن يحصل على حق الوصول. var hmacAuthenticatedApps = this . Configuration
. GetSection ( " Authentication " )
. GetSection ( " HmacAuthenticatedApps " )
. Get < HmacAuthenticationClientConfiguration [ ] > ( )
. ToDictionary ( e => e . AppId , e => e . ApiKey ) ;
{
"Authentication" : {
"HmacAuthenticatedApps" : [
{
"AppId" : " <some-app-id> " ,
"ApiKey" : " <some-api-key> "
}
]
}
}
Startup.cs
في طريقة ConfigureServices
: services
. AddAuthentication ( o =>
{
o . DefaultScheme = HmacAuthenticationDefaults . AuthenticationScheme ;
} )
. AddHmacAuthentication ( HmacAuthenticationDefaults . AuthenticationScheme , " HMAC Authentication " , o =>
{
o . MaxRequestAgeInSeconds = HmacAuthenticationDefaults . MaxRequestAgeInSeconds ;
o . HmacAuthenticatedApps = hmacAuthenticatedApps ;
} ) ;
MemoryCache
(من Microsoft.Extensions.Caching.Memory) في Startup.cs
في أسلوب ConfigureServices
. يتم استخدام MemoryCache
بواسطة HMAC AuthenticationHandler
لتحديد هجمات إعادة التشغيل. services . AddMemoryCache ( ) ;
Startup.cs
في طريقة Configure
: app . UseAuthentication ( ) ;
[ Authorize ( AuthenticationSchemes = HmacAuthenticationDefaults . AuthenticationScheme ) ]
[ Route ( " api/[controller] " ) ]
public class HomeController : Controller
{
// ...
}
يوفر HmacAuthenticaion أيضًا DelegatingHandler
لإضافة رأس ترخيص HMAC إلى طلبات HTTP.
قم بإنشاء مثيل HttpClient
الخاص بك باستخدام ApiKeyDelegatingHandler
. تأكد من عدم إنشاء مثيلات HttpClient
جديدة لكل طلب (راجع أيضًا منشور المدونة هذا للحصول على التفاصيل):
new HttpClient ( new ApiKeyDelegatingHandler ( appId , apiKey ) ) ;
أو إذا كان عميل WebAPI الخاص بك هو ASP.NET WebAPI آخر (>= ASP.NET Core 2.1)، فقم بتسجيل HttpClient
الخاص بك في Startup.cs
على سبيل المثال كما يلي:
services . AddTransient ( sp => new ApiKeyDelegatingHandler ( appId , apiKey ) ) ;
services
. AddHttpClient ( " HmacHttpClient " )
. AddHttpMessageHandler < ApiKeyDelegatingHandler > ( ) ;
لإنشاء مفتاح API، يمكن استخدام تطبيق وحدة التحكم البسيط التالي. يتم توفير هذا التنفيذ أيضًا على .NET Fiddle.
using System . Security . Cryptography ;
public class Program
{
public static void Main ( )
{
Console . WriteLine ( $" AppID: { Guid . NewGuid ( ) } or <some-speaking-name> " ) ;
Console . WriteLine ( $" ApiKey: { GenerateApiKey ( ) } " ) ;
}
private static string GenerateApiKey ( )
{
using ( var cryptoProvider = new RNGCryptoServiceProvider ( ) )
{
byte [ ] secretKeyByteArray = new byte [ 32 ] ; //256 bit
cryptoProvider . GetBytes ( secretKeyByteArray ) ;
return Convert . ToBase64String ( secretKeyByteArray ) ;
}
}
}
عادةً ما لا توجد أكبر مصادر المخاطر الأمنية في بروتوكول المصادقة ولكن في السياسات والإجراءات المحيطة باستخدامه. يتم تشجيع المنفذين بشدة على تقييم كيفية معالجة هذه الوحدة لمتطلبات الأمان الخاصة بهم. يتضمن هذا القسم قائمة غير كاملة باعتبارات الأمان التي يجب مراجعتها وفهمها قبل نشر بروتوكول المصادقة هذا على الخادم. تعتمد العديد من وسائل الحماية المتوفرة في المواصفات على ما إذا كان يتم استخدامها أم لا وكيفية استخدامها.
لا يوفر HmacAuthentication أي آلية للحصول على مجموعة بيانات الاعتماد المشتركة المطلوبة أو نقلها. يجب أن تضمن أي آلية تستخدم للحصول على بيانات اعتماد HmacAuthentication حماية عمليات الإرسال هذه باستخدام آليات طبقة النقل مثل TLS.
على الرغم من أن HmacAuthentication يوفر آلية للتحقق من سلامة طلبات HTTP، إلا أنه لا يوفر أي ضمان لسرية الطلب. وما لم يتم اتخاذ احتياطات أخرى، سيكون لدى المتنصتين حق الوصول الكامل إلى محتوى الطلب. يجب أن تدرس الخوادم بعناية أنواع البيانات التي من المحتمل أن يتم إرسالها كجزء من هذه الطلبات، وأن تستخدم آليات أمان طبقة النقل لحماية الموارد الحساسة.
يوفر HmacAuthentication تحققًا محدودًا من صحة الخادم. عند تلقي رد مرة أخرى من الخادم.
ويمكن لطرف معادٍ الاستفادة من ذلك من خلال اعتراض طلبات العميل وإعادة إجابات مضللة أو غير صحيحة. يجب على مقدمي الخدمة أخذ مثل هذه الهجمات بعين الاعتبار عند تطوير الخدمات باستخدام هذا البروتوكول، ويجب أن يطلبوا أمان طبقة النقل لأي طلبات حيث تمثل مصادقة خادم الموارد أو استجابات الخادم مشكلة.
يعمل مفتاح HmacAuthentication بنفس الطريقة التي تعمل بها كلمات المرور في أنظمة المصادقة التقليدية. من أجل حساب طلب MAC، يجب أن يكون لدى الخادم حق الوصول إلى المفتاح في شكل نص عادي. وهذا على النقيض من أنظمة التشغيل الحديثة، على سبيل المثال، التي تخزن فقط تجزئة أحادية الاتجاه لبيانات اعتماد المستخدم.
إذا تمكن أحد المهاجمين من الوصول إلى هذه المفاتيح - أو ما هو أسوأ من ذلك، إلى قاعدة بيانات الخادم التي تحتوي على جميع هذه المفاتيح - فسيكون قادرًا على تنفيذ أي إجراء نيابة عن أي مالك مورد. وبناء على ذلك، فمن الأهمية بمكان أن تقوم الخوادم بحماية هذه المفاتيح من الوصول غير المصرح به.
ما لم يتم استخدام بروتوكول أمان طبقة النقل، سيكون لدى المتنصتين حق الوصول الكامل إلى الطلبات المصادق عليها وطلب قيم MAC، وبالتالي سيكونون قادرين على شن هجمات القوة الغاشمة دون اتصال بالإنترنت لاستعادة المفتاح المستخدم. يجب أن تكون الخوادم حريصة على تعيين مفاتيح طويلة بما فيه الكفاية، وعشوائية بما فيه الكفاية، لمقاومة مثل هذه الهجمات على الأقل طوال المدة التي تكون فيها بيانات اعتماد HmacAuthentication صالحة.
على سبيل المثال، إذا كانت بيانات الاعتماد صالحة لمدة أسبوعين، فيجب على الخوادم التأكد من عدم إمكانية شن هجوم عنيف يستعيد المفتاح في أقل من أسبوعين. وبطبيعة الحال، يتم حث الخوادم على توخي الحذر، واستخدام أطول مفتاح معقول.
ومن المهم بنفس القدر أن يكون مولد الأرقام العشوائية الزائفة (PRNG) المستخدم لإنشاء هذه المفاتيح ذا جودة عالية بما فيه الكفاية. تولد العديد من تطبيقات PRNG تسلسلات رقمية قد تبدو عشوائية، ولكنها مع ذلك تظهر أنماطًا أو نقاط ضعف أخرى تجعل تحليل الشفرات أو هجمات القوة الغاشمة أسهل. يجب أن يكون القائمون على التنفيذ حريصين على استخدام PRNGs الآمنة تشفيرًا لتجنب هذه المشكلات.
يغطي طلب MAC فقط رأس HTTP Host
ورأس Content-Type
ومجموعة معينة من الرؤوس بشكل اختياري. ولا يغطي أي رؤوس أخرى لا يعرفها والتي يمكن أن تؤثر غالبًا على كيفية تفسير الخادم لنص الطلب. إذا تأثر سلوك الخادم بوجود مثل هذه الرؤوس أو قيمتها، فيمكن للمهاجم التعامل مع رؤوس الطلب دون أن يتم اكتشافه. يجب على المنفذين استخدام ميزة headers
لتمرير الرؤوس المراد إضافتها إلى التوقيع عبر رأس Authorization
المحمي بواسطة طلب MAC. ستكون السلسلة الأساسية للتوقيع مسؤولة بعد ذلك عن إضافة هذه الرؤوس المحددة إلى التوقيع حتى تصبح جزءًا من MAC.
مصادقة الاستجابة، عند تنفيذها، تغطي فقط نص الاستجابة (الحمولة) وبعض معلومات الطلب المقدمة من العميل في طلبه مثل الطابع الزمني والرقم nonce. ولا يغطي رمز حالة HTTP أو أي حقل رأس استجابة آخر (مثل الموقع) والذي يمكن أن يؤثر على سلوك العميل.
إذا كان المهاجم قادرًا على معالجة هذه المعلومات والتسبب في استخدام العميل لوقت غير صحيح، فسيكون قادرًا على جعل العميل ينشئ طلبات مصادق عليها باستخدام الوقت في المستقبل. ستفشل مثل هذه الطلبات عندما يرسلها العميل، ومن غير المحتمل أن تترك أثرًا على الخادم (نظرًا للتنفيذ الشائع لـ nonce، إذا تم فرضه على الإطلاق). سيتمكن المهاجم بعد ذلك من إعادة تشغيل الطلب في الوقت الصحيح دون اكتشافه.
سيكون حل هذه المشكلة هو مزامنة الساعة بين العميل والخادم. ولتحقيق ذلك، يقوم الخادم بإعلام العميل بالوقت الحالي عند تلقي طابع زمني غير صالح. يحدث هذا في شكل رأس التاريخ في الاستجابة. انظر RFC2616 كدافع لذلك.
يجب على العميل استخدام معلومات الوقت المقدمة من الخادم فقط إذا:
عند تلقي طلب بطابع زمني غير صحيح، يقوم الخادم بتزويد العميل بالوقت الحالي. يجب ألا يستخدم العميل أبدًا الوقت المستلم من الخادم لضبط ساعته الخاصة، ويجب أن يستخدمه فقط لحساب الإزاحة للاتصال بهذا الخادم المحدد.
يقوم HmacAuthentication بالتحقق من صحة طلب MAC الوارد مقابل رأس مضيف HTTP الوارد. يمكن للعميل الخبيث أن يبتكر أسماء مضيفين جديدة تشير إلى عنوان IP الخاص بالخادم ويستخدم ذلك لصياغة هجوم عن طريق إرسال طلب صالح مخصص لاسم مضيف آخر غير الاسم الذي يستخدمه الخادم. يجب على منفذي الخادم التحقق يدويًا من أن رأس المضيف المستلم يطابق توقعاتهم. على سبيل المثال، إذا كنت تتوقع استدعاءات API على test.myapi.com، فتحقق من أن هذا هو المجال الذي تم إرسال الطلب إليه في تنفيذ الخادم.