- بواسطة x32x01 ||
لما تربط تطبيقك ببوابة دفع زي Paymob، مش كفاية إنك تستقبل الـ Callback وتثق في البيانات اللي وصلت لك.
لازم يكون عندك طريقة تتأكد بيها إن البيانات فعلًا جاية من مصدر موثوق، وإنها ما اتعدلتش أثناء انتقالها.
وهنا بيظهر دور HMAC، وهي واحدة من الطرق المهمة للتحقق من سلامة البيانات ومصدرها، وبتستخدم بشكل واسع في الـ Webhooks وعمليات الدفع الإلكتروني.
ببساطة، هي طريقة بتستخدم:
الفكرة الأساسية إن الطرف اللي بيبعت البيانات والطرف اللي بيستقبلها يكونوا عارفين نفس الـ Secret Key.
المرسل بيحسب الـ HMAC باستخدام البيانات والـ Secret Key، وبعدها يرسل البيانات ومعاها الـ signature.
المستقبل بيحسب الـ HMAC مرة تانية باستخدام نفس البيانات والمفتاح السري.
لو النتيجتين متطابقتين، يبقى عندنا دليل قوي إن البيانات ما اتعدلتش وإن اللي أنشأ الـ signature كان عنده الـ Secret Key.
الـ Callback ممكن يحتوي على معلومات مهمة زي:
مثلًا، لو عندك endpoint بالشكل ده:
المشكلة هنا إن التطبيق وثق في قيمة
وهنا HMAC ممكن تستخدم كجزء من آلية التحقق.
الـ Payment Gateway بيستخدم الـ Secret Key لحساب الـ HMAC.
بعد كده تطبيقك يستقبل البيانات والـ signature.
التطبيق يستخدم نفس الـ Secret Key ويحسب signature جديدة من البيانات اللي استقبلها.
بعدها يقارن القيمتين.
لو القيم متطابقة، تقدر تكمل عملية التحقق.
لو مش متطابقة، لازم ترفض الطلب وما تعتمدش على البيانات اللي وصلت.
HMAC مش تشفير.
التشفير هدفه الأساسي إن البيانات ما يقدرش أي شخص غير مصرح له يقرأها.
أما HMAC فهدفه الأساسي هو Authentication وIntegrity.
يعني يساعدك تتأكد من:
يعني لو البيانات الأصلية:
فالـ HMAC مش بيحولها إلى نص مش مفهوم.
هو بينتج قيمة إضافية تستخدم للتحقق من البيانات.
هي آلية بتستخدم Hash Function داخل عملية حساب الـ MAC.
ومن أشهر الاختيارات:
الفكرة بشكل مبسط:
وبالتالي، لو نفس الـ Secret Key ونفس البيانات دخلوا في عملية الحساب، المفروض تحصل على نفس الـ signature.
مثلًا:
الكود هنا بياخد الرسالة والـ Secret Key، وبعدها يحسب HMAC باستخدام SHA-256.
لكن في تطبيق حقيقي، طريقة تكوين الـ message مهمة جدًا.
لو بوابة الدفع بتطلب منك حساب الـ HMAC من مجموعة محددة من الحقول وبترتيب محدد، لازم تلتزم بالـ specification الخاصة بالبوابة حرفيًا.
مينفعش تختار الحقول أو ترتيبها من نفسك.
وصول HTTP request إلى endpoint عندك مش معناه تلقائيًا إن البيانات موثوقة.
في Payment Webhooks، الأفضل إنك تتعامل مع البيانات كـ untrusted input لحد ما تخلص كل عمليات التحقق المطلوبة.
ممكن يكون عندك مثلًا:
HTTPS مهم جدًا لأنه بيحمي الاتصال أثناء انتقال البيانات بين العميل والسيرفر.
لكن HTTPS وHMAC بيحلوا مشاكل مختلفة.
HTTPS يساعد في حماية الاتصال نفسه.
HMAC يساعد التطبيق في التحقق من سلامة الرسالة ومعرفة إن الـ signature اتعملت باستخدام الـ Secret Key الصحيح.
في Webhooks وPayment Callbacks، وجود آلية signature verification حسب توثيق مزود الخدمة يضيف طبقة مهمة من الحماية.
الفكرة الأساسية اللي لازم تخرج بيها هي إن HMAC مش مجرد كود بنحطه في الـ Callback وخلاص.
هو آلية بتخلي الطرفين يقدروا يتحققوا من إن الرسالة اتوقعت باستخدام الـ Secret Key الصحيح وإن محتوى الرسالة ما اتغيرش.
استخدم آلية التحقق اللي بتوفرها بوابة الدفع، ولو النظام بيعتمد على HMAC، لازم تحسب الـ signature بالطريقة المحددة في الـ API documentation وتقارنها بالطريقة الآمنة المناسبة.
وبالنسبة لـ ASP.NET Core، .NET بيوفر أدوات جاهزة زي
لكن الأهم من كتابة الكود نفسه هو إنك تفهم إيه البيانات اللي المفروض تدخل في الـ HMAC، وإزاي الـ Secret Key بيتدار، وإزاي الـ signature يتم التحقق منها.
لأن غلطة صغيرة في تكوين الـ message أو طريقة المقارنة ممكن تخلي نظام التحقق كله مش شغال بالشكل اللي أنت متوقعه.
لازم يكون عندك طريقة تتأكد بيها إن البيانات فعلًا جاية من مصدر موثوق، وإنها ما اتعدلتش أثناء انتقالها.
وهنا بيظهر دور 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 بعد كده تطبيقك يستقبل البيانات والـ signature.
التطبيق يستخدم نفس الـ Secret Key ويحسب signature جديدة من البيانات اللي استقبلها.
بعدها يقارن القيمتين.
لو القيم متطابقة، تقدر تكمل عملية التحقق.
لو مش متطابقة، لازم ترفض الطلب وما تعتمدش على البيانات اللي وصلت.
هل HMAC يعتبر Encryption؟
لأ، ودي نقطة مهمة جدًا.HMAC مش تشفير.
التشفير هدفه الأساسي إن البيانات ما يقدرش أي شخص غير مصرح له يقرأها.
أما HMAC فهدفه الأساسي هو Authentication وIntegrity.
يعني يساعدك تتأكد من:
- إن البيانات اتولدت باستخدام Secret Key صحيح.
- إن البيانات ما اتغيرتش بعد إنشاء الـ signature.
يعني لو البيانات الأصلية:
JSON:
{
"orderId": 12345,
"status": "success"
} هو بينتج قيمة إضافية تستخدم للتحقق من البيانات.
إيه علاقة HMAC بـ SHA-256؟
HMAC مش Hash Function لوحدها.هي آلية بتستخدم Hash Function داخل عملية حساب الـ MAC.
ومن أشهر الاختيارات:
HMAC-SHA256الفكرة بشكل مبسط:
Code:
Secret Key + Message
|
v
HMAC-SHA256
|
v
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>
} لكن في تطبيق حقيقي، طريقة تكوين الـ message مهمة جدًا.
لو بوابة الدفع بتطلب منك حساب الـ HMAC من مجموعة محددة من الحقول وبترتيب محدد، لازم تلتزم بالـ specification الخاصة بالبوابة حرفيًا.
مينفعش تختار الحقول أو ترتيبها من نفسك.
أهم نقطة: متثقش في Callback لمجرد إنه وصل
دي من أهم الحاجات اللي لازم تاخد بالك منها.وصول HTTP request إلى endpoint عندك مش معناه تلقائيًا إن البيانات موثوقة.
في Payment Webhooks، الأفضل إنك تتعامل مع البيانات كـ untrusted input لحد ما تخلص كل عمليات التحقق المطلوبة.
ممكن يكون عندك مثلًا:
- التحقق من الـ HMAC أو الـ signature حسب توثيق بوابة الدفع.
- التحقق من قيمة المبلغ والـ currency.
- التأكد إن الـ order موجود.
- التأكد إن العملية مرتبطة فعلًا بالـ order الصحيح.
- منع تنفيذ نفس العملية أكثر من مرة.
- تسجيل الأحداث المهمة للمراجعة.
هل HTTPS يغني عن HMAC؟
لأ.HTTPS مهم جدًا لأنه بيحمي الاتصال أثناء انتقال البيانات بين العميل والسيرفر.
لكن HTTPS وHMAC بيحلوا مشاكل مختلفة.
HTTPS يساعد في حماية الاتصال نفسه.
HMAC يساعد التطبيق في التحقق من سلامة الرسالة ومعرفة إن الـ signature اتعملت باستخدام الـ Secret Key الصحيح.
في Webhooks وPayment Callbacks، وجود آلية signature verification حسب توثيق مزود الخدمة يضيف طبقة مهمة من الحماية.
فيديو شرح HMAC
لو عايز تفهم الفكرة من الأساس قبل ما تدخل في كتابة كود ASP.NET Core، تقدر تشوف الشرح النظري الخاص بـ HMAC على YouTube:
هو آلية بتخلي الطرفين يقدروا يتحققوا من إن الرسالة اتوقعت باستخدام الـ 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.