ما هو HMAC وتأمين Payment Callbacks ؟

x32x01
  • بواسطة x32x01 ||
  • #1
لما تربط تطبيقك ببوابة دفع زي Paymob، مش كفاية إنك تستقبل الـ Callback وتثق في البيانات اللي وصلت لك.
لازم يكون عندك طريقة تتأكد بيها إن البيانات فعلًا جاية من مصدر موثوق، وإنها ما اتعدلتش أثناء انتقالها.
وهنا بيظهر دور HMAC، وهي واحدة من الطرق المهمة للتحقق من سلامة البيانات ومصدرها، وبتستخدم بشكل واسع في الـ Webhooks وعمليات الدفع الإلكتروني.

يعني إيه HMAC؟​

HMAC اختصار لـ Hash-based Message Authentication Code.
ببساطة، هي طريقة بتستخدم:
  • البيانات اللي عايزين نتحقق منها.
  • Secret Key معروف بين الطرفين.
  • Hash Function زي SHA-256.
علشان تنتج قيمة اسمها HMAC.
الفكرة الأساسية إن الطرف اللي بيبعت البيانات والطرف اللي بيستقبلها يكونوا عارفين نفس الـ Secret Key.
المرسل بيحسب الـ HMAC باستخدام البيانات والـ Secret Key، وبعدها يرسل البيانات ومعاها الـ signature.
المستقبل بيحسب الـ HMAC مرة تانية باستخدام نفس البيانات والمفتاح السري.
لو النتيجتين متطابقتين، يبقى عندنا دليل قوي إن البيانات ما اتعدلتش وإن اللي أنشأ الـ signature كان عنده الـ Secret Key.



ليه HMAC مهم في بوابات الدفع؟​

تخيل إن Paymob بعتت لتطبيقك Callback بعد نجاح عملية دفع.
الـ Callback ممكن يحتوي على معلومات مهمة زي:
  • حالة عملية الدفع.
  • رقم العملية.
  • المبلغ.
  • بيانات العميل.
  • معرف الطلب.
لو تطبيقك اعتمد على البيانات دي من غير ما يتحقق من صحتها، فده ممكن يعمل مشكلة أمنية كبيرة.

مثلًا، لو عندك endpoint بالشكل ده:
C#:
[HttpPost("payment/callback")]
public IActionResult PaymentCallback(PaymentCallbackModel data)
{
if (data.Status == "success")
{
// Mark order as paid
}

return Ok();<br>
}
المشكلة هنا إن التطبيق وثق في قيمة Status من غير ما يتأكد إن الـ Callback فعلًا صادر من بوابة الدفع.
وهنا HMAC ممكن تستخدم كجزء من آلية التحقق.



إزاي HMAC بيشتغل؟​

بشكل مبسط، العملية ممكن تتخيلها بالشكل ده:
Code:
Payment Gateway
|
| Data + HMAC Signature
v
Your ASP.NET Core Application
|
| Recalculate HMAC
v
Compare Signatures
|
+--+--+
| |
Match No Match
| |
Accept Reject
الـ Payment Gateway بيستخدم الـ Secret Key لحساب الـ HMAC.
بعد كده تطبيقك يستقبل البيانات والـ signature.
التطبيق يستخدم نفس الـ Secret Key ويحسب signature جديدة من البيانات اللي استقبلها.
بعدها يقارن القيمتين.
لو القيم متطابقة، تقدر تكمل عملية التحقق.
لو مش متطابقة، لازم ترفض الطلب وما تعتمدش على البيانات اللي وصلت.



هل HMAC يعتبر Encryption؟​

لأ، ودي نقطة مهمة جدًا.
HMAC مش تشفير.
التشفير هدفه الأساسي إن البيانات ما يقدرش أي شخص غير مصرح له يقرأها.
أما HMAC فهدفه الأساسي هو Authentication وIntegrity.

يعني يساعدك تتأكد من:
  • إن البيانات اتولدت باستخدام Secret Key صحيح.
  • إن البيانات ما اتغيرتش بعد إنشاء الـ signature.
لكن HMAC مش بيخفي البيانات نفسها.

يعني لو البيانات الأصلية:
JSON:
{
"orderId": 12345,
"status": "success"
}
فالـ HMAC مش بيحولها إلى نص مش مفهوم.
هو بينتج قيمة إضافية تستخدم للتحقق من البيانات.



إيه علاقة HMAC بـ SHA-256؟​

HMAC مش Hash Function لوحدها.
هي آلية بتستخدم Hash Function داخل عملية حساب الـ MAC.
ومن أشهر الاختيارات:
HMAC-SHA256
الفكرة بشكل مبسط:
Code:
Secret Key + Message
|
v
HMAC-SHA256
|
v
Signature
وبالتالي، لو نفس الـ Secret Key ونفس البيانات دخلوا في عملية الحساب، المفروض تحصل على نفس الـ signature.



HMAC في ASP.NET Core​

في .NET تقدر تستخدم HMACSHA256 لحساب الـ HMAC.
مثلًا:
C#:
using System.Security.Cryptography;
using System.Text;

public static string CalculateHmac(string message, string secretKey)
{
byte[] key = Encoding.UTF8.GetBytes(secretKey);
byte[] data = Encoding.UTF8.GetBytes(message);

using var hmac = new HMACSHA256(key);<br><br>byte[] hash = hmac.ComputeHash(data);<br><br>return Convert.ToHexString(hash);<br>
}
الكود هنا بياخد الرسالة والـ Secret Key، وبعدها يحسب HMAC باستخدام SHA-256.
لكن في تطبيق حقيقي، طريقة تكوين الـ message مهمة جدًا.
لو بوابة الدفع بتطلب منك حساب الـ HMAC من مجموعة محددة من الحقول وبترتيب محدد، لازم تلتزم بالـ specification الخاصة بالبوابة حرفيًا.
مينفعش تختار الحقول أو ترتيبها من نفسك.



أهم نقطة: متثقش في Callback لمجرد إنه وصل​

دي من أهم الحاجات اللي لازم تاخد بالك منها.
وصول HTTP request إلى endpoint عندك مش معناه تلقائيًا إن البيانات موثوقة.
في Payment Webhooks، الأفضل إنك تتعامل مع البيانات كـ untrusted input لحد ما تخلص كل عمليات التحقق المطلوبة.

ممكن يكون عندك مثلًا:
  1. التحقق من الـ HMAC أو الـ signature حسب توثيق بوابة الدفع.
  2. التحقق من قيمة المبلغ والـ currency.
  3. التأكد إن الـ order موجود.
  4. التأكد إن العملية مرتبطة فعلًا بالـ order الصحيح.
  5. منع تنفيذ نفس العملية أكثر من مرة.
  6. تسجيل الأحداث المهمة للمراجعة.
الـ HMAC جزء مهم من المنظومة، لكنه مش بديل عن باقي إجراءات التحقق.



هل HTTPS يغني عن HMAC؟​

لأ.
HTTPS مهم جدًا لأنه بيحمي الاتصال أثناء انتقال البيانات بين العميل والسيرفر.
لكن HTTPS وHMAC بيحلوا مشاكل مختلفة.
HTTPS يساعد في حماية الاتصال نفسه.
HMAC يساعد التطبيق في التحقق من سلامة الرسالة ومعرفة إن الـ signature اتعملت باستخدام الـ Secret Key الصحيح.
في Webhooks وPayment Callbacks، وجود آلية signature verification حسب توثيق مزود الخدمة يضيف طبقة مهمة من الحماية.



فيديو شرح HMAC​

لو عايز تفهم الفكرة من الأساس قبل ما تدخل في كتابة كود ASP.NET Core، تقدر تشوف الشرح النظري الخاص بـ HMAC على YouTube:
Video thumbnail
الفكرة الأساسية اللي لازم تخرج بيها هي إن HMAC مش مجرد كود بنحطه في الـ Callback وخلاص.
هو آلية بتخلي الطرفين يقدروا يتحققوا من إن الرسالة اتوقعت باستخدام الـ Secret Key الصحيح وإن محتوى الرسالة ما اتغيرش.



الخلاصة​

لو بتتعامل مع Payment Gateway أو Webhook، متتعاملش مع الـ Callback على إنه مصدر موثوق لمجرد إنه وصل إلى الـ endpoint بتاعك.
استخدم آلية التحقق اللي بتوفرها بوابة الدفع، ولو النظام بيعتمد على HMAC، لازم تحسب الـ signature بالطريقة المحددة في الـ API documentation وتقارنها بالطريقة الآمنة المناسبة.
وبالنسبة لـ ASP.NET Core، .NET بيوفر أدوات جاهزة زي HMACSHA256 لتنفيذ عملية حساب الـ HMAC.

لكن الأهم من كتابة الكود نفسه هو إنك تفهم إيه البيانات اللي المفروض تدخل في الـ HMAC، وإزاي الـ Secret Key بيتدار، وإزاي الـ signature يتم التحقق منها.
لأن غلطة صغيرة في تكوين الـ message أو طريقة المقارنة ممكن تخلي نظام التحقق كله مش شغال بالشكل اللي أنت متوقعه.



الأسئلة الشائعة​

------------

هل HMAC تشفير؟​

لأ. HMAC آلية للتحقق من سلامة البيانات ومصدر الـ signature، لكنها لا تقوم بتشفير البيانات وإخفائها.

هل HMAC مناسب لتأمين Payment Callbacks؟​

أيوه، HMAC ممكن يكون جزء مهم من آلية التحقق من Webhooks وPayment Callbacks، بشرط تطبيق الـ signature verification حسب توثيق مزود خدمة الدفع.

هل HTTPS يغني عن HMAC؟​

لأ. HTTPS وHMAC بيقدموا طبقات حماية مختلفة، ووجود HTTPS لا يعني إن التطبيق لازم يثق تلقائيًا في محتوى كل Callback.

هل أقدر أستخدم HMACSHA256 مع ASP.NET Core؟​

أيوه. .NET يوفر HMACSHA256 من خلال System.Security.Cryptography لحساب HMAC باستخدام SHA-256.
 
مواضيع مشابهة
x32x01
الردود
0
المشاهدات
28
x32x01
x32x01
إحصائيات المنتدى
المواضيع
2,283
المشاركات
2,348
الأعضاء
16
آخر عضو مسجل
HcN57
عودة
أعلى