0Pricing
Cryptology Academy · درس

PKCE: تأمين العملاء العامين

تعرّفوا إلى Proof Key for Code Exchange وكيفية منعه لهجمات اعتراض authorization code.

PKCE: تأمين العملاء العامين درس مجاني في Cryptology Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cryptology Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cryptology Academy 4 دروس في المجموع.

اعتراض رمز التفويض

من دون PKCE، تكون تطبيقات الهاتف المحمول عرضة لهجمات اعتراض رمز التفويض. فعندما يعيد خادم التفويض توجيه رمز التفويض إلى مخطط URI المخصص المسجل للتطبيق، مثل myapp://callback، يمكن لأي تطبيق ضار على الجهاز نفسه يسجل مخطط URI نفسه اعتراض إعادة التوجيه وسرقة الرمز.

كيفية حدوث الاعتراض

تتمثل الهجمة في أن يسجل تطبيق ضار مخطط URI المخصص نفسه الذي يستخدمه التطبيق الشرعي. وعندما يعيد خادم التفويض توجيه الرمز إلى myapp://callback، قد يعرض نظام التشغيل التطبيقين بوصفهما معالِجين لهذا العنوان. إذا اختار المستخدم التطبيق الضار أو جعله نظام التشغيل التطبيق الافتراضي، يحصل المهاجم على رمز التفويض ويمكنه استبداله بالرموز من دون معرفة سر العميل.

متحقق رمز PKCE

يضيف PKCE (RFC 7636) سرًا يُنشأ ديناميكيًا إلى تدفق رمز التفويض. وقبل بدء التدفق، ينشئ العميل سلسلة عشوائية تشفيريًا يتراوح طولها بين 43 و128 محرفًا، تُسمى متحقق الرمز. وتكون هذه السلسلة فريدة لكل طلب تفويض، ولا تُنقل حتى خطوة تبادل الرموز.

حساب تحدي الرمز

يحسب العميل تحدي الرمز من متحقق الرمز: code_challenge = BASE64URL(SHA256(code_verifier)). ويُعد استخدام SHA256 الطريقة المطلوبة في RFC 7636؛ أما طريقة "plain"، التي ترسل متحقق الرمز مباشرةً، فلا يُنصح بها. وتحدي الرمز هو تحويل أحادي الاتجاه لمتحقق الرمز، ما يعني أن معرفة التحدي لا تكشف متحقق الرمز.

تضمين تحدي الرمز في التفويض

يتضمن طلب التفويض معاملين إضافيين: "code_challenge=BASE64URL(SHA256(verifier))&code_challenge_method=S256". يخزّن خادم التفويض تحدي الرمز المرتبط برمز التفويض المُصدر. ولا يُنقل في هذه المرحلة أي سر إلى الخادم يمكن اعتراضه.

تبادل الرموز باستخدام متحقق الرمز

أثناء تبادل الرموز، أي عند إرسال POST إلى نقطة نهاية الرموز، يتضمن العميل "code_verifier=ORIGINAL_RANDOM_STRING" إلى جانب رمز التفويض. يحسب خادم التفويض BASE64URL(SHA256(code_verifier)) ويتحقق من مطابقته لقيمة code_challenge المخزنة. ولا يستطيع اجتياز هذا التحقق إلا العميل الشرعي الذي أنشأ متحقق الرمز.

لماذا يفشل الاعتراض مع PKCE

إذا اعترض مهاجم رمز التفويض، فلن يحصل إلا على الرمز وتحدي الرمز، وهو معلن. ولكي يستبدل الرمز بالرموز، يجب عليه تقديم متحقق الرمز. وبما أن العميل الشرعي أنشأ متحقق الرمز ولم يُنقل حتى تبادل الرموز، الذي يحدث بأمان، فلا يستطيع المهاجم حساب متحقق الرمز أو الحصول عليه.

PKCE يمنع حقن الرموز

يمنع PKCE أيضًا هجمات حقن رمز التفويض، حيث يستبدل المهاجم رمزًا صالحًا برمز مسروق في إعادة التوجيه. لا يتطابق تحدي الرمز المسروق مع متحقق الرمز الذي سيقدمه عميل الضحية، مما يؤدي إلى فشل تبادل الرموز. يوفر PKCE دفاعًا متعدد الطبقات ضد عدة مسارات للهجوم في الوقت نفسه.

PKCE لجميع العملاء

على الرغم من أن RFC 7636 وُصف في البداية بأنه حل للعملاء العامين (الذين لا يملكون أسرار عملاء)، فإن OAuth Security BCP وOAuth 2.1 يفرضان استخدام PKCE مع جميع العملاء، بما في ذلك العملاء السريون الذين يملكون أسرار عملاء. يوفر PKCE حماية مستقلة عن مصادقة العميل، مما يجعله مفيدًا للجميع.

PKCE في OAuth 2.1

يجمع OAuth 2.1 (draft-ietf-oauth-v2-1) أفضل الممارسات الأمنية من OAuth 2.0 Security BCP في مستند واحد. ويفرض PKCE على جميع تدفقات رمز التفويض، ويُهمل التدفق الضمني، ويتطلب تدوير رموز التحديث. وأصبح PKCE عمليًا خط الأساس المطلوب لأي تطبيق OAuth 2.0 جديد.

ملاحظات التنفيذ

يتطلب تنفيذ PKCE بشكل صحيح ما يلي: استخدام مولد عشوائي آمن تشفيريًا لمتحقق الرمز (32 بايت عشوائيًا على الأقل، ثم ترميزها باستخدام base64url)، وتخزين متحقق الرمز بأمان في العميل (وليس في عنوان URL أو السجلات)، واستخدام طريقة S256 (وليس plain)، والتأكد من التخلص من متحقق الرمز بعد تبادل الرموز. تتولى معظم مكتبات OAuth الحديثة معالجة PKCE تلقائيًا.

التحقق من متحقق رمز PKCE

في PKCE، ما العلاقة بين متحقق الرمز وتحدي الرمز؟

مراجعة الدرس: أمان PKCE

يمنع PKCE (RFC 7636) اعتراض رمز التفويض من خلال ربط كل رمز بمتحقق رمز يُنشأ ديناميكيًا ولا يعرفه سوى العميل الشرعي. يُجزّأ متحقق الرمز لإنتاج تحدي الرمز (الذي يُرسل علنًا). ويتطلب تبادل الرموز متحقق الرمز الأصلي. يمنع PKCE هجمات الاعتراض والحقن معًا. ويفرض OAuth 2.1 استخدام PKCE في جميع تدفقات رمز التفويض.

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

هل درس «PKCE: تأمين العملاء العامين» مجاني؟

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

ماذا ستتعلم في «PKCE: تأمين العملاء العامين»؟

تعرّفوا إلى Proof Key for Code Exchange وكيفية منعه لهجمات اعتراض authorization code. تتمرن على Cryptology Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «PKCE: تأمين العملاء العامين»؟

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

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

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

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

  1. تدفقات OAuth 2.0 وأنواع الرموز
  2. PKCE: تأمين العملاء العامين
  3. مطالبات OpenID Connect ورموز ID
  4. ثغرات OAuth وأنماط الهجوم
← العودة إلى Cryptology Academy