0Pricing
Java Academy · درس

‏HMAC-SHA256 لضمان سلامة الرسائل

أنشئ توقيعات HMAC-SHA256 وتحقق منها لضمان سلامة حمولات API

‏HMAC-SHA256 لضمان سلامة الرسائل درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ما المقصود بـ HMAC؟

يجمع HMAC (رمز مصادقة الرسائل القائم على التجزئة) دالة تجزئة تشفيرية مع مفتاح سرّي لإنتاج MAC. وهو يثبت أن البيانات لم يُعبث بها، وأن المرسل يعرف المفتاح السرّي.

‏HMAC مقابل التجزئة العادية

يمكن لأي شخص حساب تجزئة SHA-256 عادية. أما HMAC فيتطلب المفتاح السرّي؛ فلا يمكن إنشاء HMAC صالح أو التحقق منه إلا للأطراف التي تعرف المفتاح. توفر التجزئات العادية سلامة البيانات، لكنها لا توفر المصادقة.

حساب HMAC-SHA256 في Java

استخدم Mac.getInstance("HmacSHA256")، ثم هيّئه باستخدام SecretKeySpec واستدعِ doFinal(data).

byte[] keyBytes = "my-secret-key".getBytes(StandardCharsets.UTF_8);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
byte[] hmac = mac.doFinal("payload data".getBytes(StandardCharsets.UTF_8));
String hmacHex = HexFormat.of().formatHex(hmac);
System.out.println(hmacHex); // 64-char hex

التحقق من HMAC

أعد حساب HMAC للبيانات المستلمة باستخدام المفتاح المشترك. استخدم مقارنة بزمن ثابت (MessageDigest.isEqual) لمنع هجمات التوقيت.

byte[] expectedHmac = computeHmac(key, receivedPayload);
byte[] actualHmac    = HexFormat.of().parseHex(receivedHmacHex);
boolean valid = MessageDigest.isEqual(expectedHmac, actualHmac);
if (!valid) throw new SecurityException("HMAC verification failed — data tampered!");

إنشاء مفتاح آمن

ينبغي أن تتكون مفاتيح HMAC من بايتات عشوائية، لا من كلمات مرور. استخدم KeyGenerator أو SecureRandom لإنشاء مفتاح بطول 256 بت.

KeyGenerator kg = KeyGenerator.getInstance("HmacSHA256");
kg.init(256);
SecretKey key = kg.generateKey();
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());

‏HMAC لتوقيع طلبات API

احسب HMAC لطريقة HTTP والمسار والطابع الزمني والنص الأساسي. أدرج HMAC في ترويسة X-Signature. يعيد الخادم حسابه ويقارنه للتحقق من عدم العبث بالطلب.

String payload = method + "\n" + path + "\n" + timestamp + "\n" + body;
byte[] hmac = computeHmac(apiSecretKey, payload);
request.header("X-Signature", "hmac-sha256=" + HexFormat.of().formatHex(hmac));
request.header("X-Timestamp", timestamp);

الوقاية من هجمات إعادة التشغيل

يمكن للمهاجم إعادة إرسال طلب صالح موقّع. أدرج طابعًا زمنيًا في البيانات الموقّعة، وارفض الطلبات الأقدم من بضع دقائق.

long timestamp = Long.parseLong(request.getHeader("X-Timestamp"));
if (Math.abs(System.currentTimeMillis() / 1000 - timestamp) > 300) {
    throw new SecurityException("Request too old — possible replay attack");
}

‏HMAC للتحقق من Webhook

توقّع GitHub وStripe والعديد من الخدمات Webhook باستخدام HMAC. تحقّق من ترويسة X-Hub-Signature-256 للتأكد من أن Webhook جاء من الخدمة ولم يُعدَّل.

// GitHub webhook verification:
String received = request.getHeader("X-Hub-Signature-256").replace("sha256=","");
byte[] expected = computeHmac(webhookSecret, request.getBody());
boolean valid = MessageDigest.isEqual(expected, HexFormat.of().parseHex(received));

‏HMAC في JWT

يُعد HS256 (‏HMAC-SHA256) خوارزمية توقيع شائعة لـ JWT. يُوقَّع الرأس والحمولة باستخدام سرّ مشترك. يجب أن يعرف المُصدِر وجهة التحقق السر نفسه، ولذلك فهو مناسب للخدمات المصغّرة الواقعة ضمن حدود الثقة نفسها.

تدوير مفاتيح HMAC

دوّر مفاتيح HMAC دوريًا. أثناء التدوير، اقبل HMAC الناتج باستخدام المفتاح القديم أو الجديد خلال فترة تداخل قصيرة، ثم أوقف استخدام المفتاح القديم.

متى تستخدم HMAC مقابل التوقيعات الرقمية

HMAC: متماثل؛ يشترك الطرفان في السر، وهو سريع ومناسب لواجهات API الداخلية والتحقق من Webhook. أما التوقيعات الرقمية (RSA/ECDSA) فغير متماثلة؛ إذ لا يملك المفتاح الخاص إلا الموقّع، ويمكن لأي شخص يملك المفتاح العام التحقق منها، ولذلك تناسب JWT في الأنظمة الموزعة.

تحقق سريع

لماذا يجب أن تستخدم مقارنة HMAC مساواة بزمن ثابت؟

مراجعة

يوفر HMAC-SHA256 سلامة موثّقة؛ إذ يثبت مصدر البيانات وعدم العبث بها. استخدم Mac.getInstance("HmacSHA256"). استخدم دائمًا مقارنة بزمن ثابت. أدرج الطوابع الزمنية لمنع هجمات إعادة التشغيل. استخدمه لتوقيع طلبات API والتحقق من Webhook وتوقيعات JWT باستخدام HS256.

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

هل درس «‏HMAC-SHA256 لضمان سلامة الرسائل» مجاني؟

نعم — نص درس «‏HMAC-SHA256 لضمان سلامة الرسائل» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «‏HMAC-SHA256 لضمان سلامة الرسائل»؟

أنشئ توقيعات HMAC-SHA256 وتحقق منها لضمان سلامة حمولات API تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «‏HMAC-SHA256 لضمان سلامة الرسائل»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التجزئة التشفيرية باستخدام MessageDigest
  2. التشفير المتماثل باستخدام AES
  3. ‏HMAC-SHA256 لضمان سلامة الرسائل
  4. ‏JWT: البنية والإنشاء والتحقق
← العودة إلى Java Academy