0Pricing
Cryptology Academy · درس

واجهة OpenSSL API: البنى الأساسية ومواطن الخلل

تعرّفوا إلى EVP APIs وتجريدات BIO وأكثر أنماط إساءة استخدام OpenSSL API شيوعًا.

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

واجهة EVP: الواجهة عالية المستوى

واجهة EVP (Envelope) هي الواجهة عالية المستوى في OpenSSL للعمليات التشفيرية، وهي الواجهة الصحيحة التي ينبغي استخدامها في شيفرة التطبيقات. فهي تخفي التفاصيل الخاصة بكل خوارزمية خلف واجهة متسقة، وتدعم تلقائيًا تسريع الأجهزة عبر المحركات والمزوّدين، كما تتعامل بصورة صحيحة مع تفاصيل الحشو وأنماط التشغيل. أما واجهات OpenSSL منخفضة المستوى الخاصة بالخوارزميات، فأصبحت مهجورة في الإصدارات الحديثة وينبغي تجنبها.

EVP_CIPHER_CTX للتشفير المتماثل

يستخدم التشفير المتماثل في OpenSSL كائن السياق EVP_CIPHER_CTX. وتسلسل العملية هو: استخدام EVP_CIPHER_CTX_new لتخصيص السياق، ثم EVP_EncryptInit_ex لتهيئته بالشيفرة والمفتاح، ثم استدعاء EVP_EncryptUpdate بشكل متكرر لمعالجة البيانات، ثم EVP_EncryptFinal_ex لمعالجة الكتلة النهائية واسترداد الناتج المتبقي، وأخيرًا EVP_CIPHER_CTX_free لتحرير الذاكرة. ويُعد تخطي EncryptFinal_ex خطأً شائعًا يؤدي إلى ناتج مبتور.

EVP_MD_CTX للتجزئة

تستخدم عملية إنشاء ملخص الرسالة EVP_MD_CTX بطريقة مماثلة: EVP_MD_CTX_new، ثم EVP_DigestInit_ex مع الخوارزمية (EVP_sha256() وEVP_sha3_256() وغيرهما)، ثم EVP_DigestUpdate مع أجزاء البيانات، ثم EVP_DigestFinal_ex لاسترداد التجزئة. وتستخدم عمليات HMAC كائن HMAC_CTX منفصلًا أو واجهة EVP_MAC الأحدث. ويتيح تجريد EVP تبديل خوارزميات التجزئة بتغيير استدعاء دالة واحد.

EVP_PKEY للمفاتيح غير المتماثلة

يُعد EVP_PKEY كائن المفتاح غير المتماثل الموحد في OpenSSL، ويدعم RSA وECDSA وEd25519 وDH وخوارزميات أخرى من خلال واجهة واحدة. ويمكن إنشاء المفاتيح من ملفات PEM أو DER باستخدام PEM_read_PrivateKey وPEM_read_PUBKEY، أو توليدها باستخدام EVP_PKEY_keygen. وتنفذ EVP_PKEY_sign وEVP_PKEY_verify عمليتي التوقيع والتحقق لأي نوع من المفاتيح باستخدام استدعاءات الدوال نفسها.

تجريد BIO لعمليات الإدخال والإخراج

تُعد BIO (Basic I/O) طبقة تجريد الإدخال والإخراج في OpenSSL، وتتيح قراءة البيانات المحمية بـ TLS أو البيانات الخام وكتابتها عبر سلسلة من كائنات BIO. وقد تكون سلسلة BIO على النحو التالي: ربط BIO_new_ssl (طبقة TLS) بـ BIO_new_connect (اتصال TCP). تؤدي الكتابة إلى BIO الخاص بـ SSL تلقائيًا إلى تشفير البيانات وإرسالها، بينما تؤدي القراءة إلى فك تشفير البيانات المستلمة. وتدعم كائنات BIO الملفات والمقابس ومخازن الذاكرة والمرشحات، مثل base64 والتخزين المؤقت.

كائنات SSL_CTX وSSL

تستخدم اتصالات TLS في OpenSSL كائنين: يخزّن SSL_CTX (السياق) الإعدادات المشتركة، مثل الشهادة والمفتاح الخاص وحزمة CA وحدود إصدارات البروتوكول وقائمة الشيفرات. ويمثل SSL اتصالًا فرديًا مشتقًا من السياق. أنشئ SSL_CTX واحدًا لكل تطبيق، ثم أنشئ منه كائنات SSL لكل اتصال. وتنقل SSL_read وSSL_write النص العادي، بينما تتولى OpenSSL داخليًا جميع عمليات تأطير TLS والتشفير.

مطب خطير: تجاهل القيم المعادة

يتمثل أخطر أخطاء OpenSSL في تجاهل القيم المعادة. إذ تعيد EVP_EncryptFinal_ex وSSL_read وSSL_write قيمًا سالبة أو صفرًا للإشارة إلى الأخطاء. وقد يؤدي استدعاء SSL_read ضمن حلقة من دون التحقق من SSL_get_error إلى حلقات لا نهائية أو إلى تفويت الأخطاء. يجب التحقق من القيمة المعادة لكل دالة في OpenSSL يمكن أن تفشل؛ إذ تشير حالات الفشل غالبًا إلى ظروف ذات صلة بالأمان، مثل فشل المصافحة أو أخطاء التحقق من الشهادة.

مطب: عدم التحقق من SSL_get_error

يمكن أن تعيد SSL_read وSSL_write القيمة SSL_ERROR_WANT_READ أو SSL_ERROR_WANT_WRITE، مما يشير إلى ضرورة إعادة العملية بعد انتظار الإدخال والإخراج. وهذه ليست أخطاء فعلية، بل إشعارات بعمليات إدخال وإخراج غير حاجبة. أما الشيفرة التي لا تستدعي SSL_get_error ولا تفرّع التنفيذ بصورة صحيحة بناءً على want-read وwant-write، فإما أن تدخل في حلقة مشغولة أو تتعامل مع هذه الحالات خطأً على أنها أخطاء. استخدم SSL_get_error دائمًا لتفسير القيم المعادة السالبة من عمليات إدخال وإخراج TLS.

واجهات منخفضة المستوى مهجورة

تتضمن OpenSSL كثيرًا من الدوال منخفضة المستوى المهجورة التي ينبغي ألا تظهر في الشيفرة الجديدة، ومنها: الاستدعاءات المباشرة لـ DES_encrypt1، والاستخدام المباشر لدوال تجزئة SHA1 أو MD5 من دون طبقة EVP، واستخدام RSA_private_encrypt بدلًا من EVP_PKEY_sign، وAES_encrypt (وهو AES بنمط ECB من دون مصادقة). تتجاوز هذه الواجهات فحوصات الأمان، أو تستخدم خوارزميات مهجورة، أو تكون ببساطة أقل أمانًا من نظيراتها في EVP. وغالبًا ما تنبّه تحذيرات المصرّف إلى استخدام الواجهات المهجورة.

تسرّبات الذاكرة في شيفرة OpenSSL

تستخدم OpenSSL إدارة صريحة للذاكرة؛ لذا يجب تحرير كل كائن مخصّص صراحةً. ومن تسرّبات الذاكرة الشائعة نسيان استدعاء EVP_CIPHER_CTX_free بعد التشفير، أو عدم استدعاء SSL_free بعد إغلاق الاتصال، أو عدم استدعاء X509_free بعد التحقق من الشهادة. وفي الخوادم طويلة التشغيل، تؤدي هذه التسرّبات إلى استنفاد الذاكرة تدريجيًا. استخدم أدوات مثل valgrind أو AddressSanitizer لاكتشاف تسرّبات ذاكرة OpenSSL أثناء التطوير.

نموذج المزوّدين في OpenSSL 3.0

قدّمت OpenSSL 3.0 نموذج المزوّدين ليحل محل واجهة ENGINE الأقدم لتسريع الأجهزة. والمزوّدون وحدات قابلة للتحميل تطبّق الخوارزميات التشفيرية، ومنها المزوّد الافتراضي (البرمجي)، والمزوّد القديم (للخوارزميات الأقدم)، ومزوّد FIPS (المتحقق منه وفق FIPS 140-2)، ومزوّدون من جهات خارجية لأجهزة HSM. ويتيح مزوّد FIPS التشغيل المتوافق من خلال تقييد الخوارزميات المتاحة بتلك المعتمدة وفق FIPS 140-2، من دون تغيير شيفرة التطبيق.

أهمية واجهة EVP

لماذا تُفضّل واجهة OpenSSL EVP على الواجهات منخفضة المستوى الخاصة بكل خوارزمية؟

مراجعة واجهة OpenSSL

مراجعة واجهة OpenSSL: استخدم دائمًا واجهة EVP عالية المستوى؛ وEVP_CIPHER_CTX للعمليات المتماثلة؛ وEVP_MD_CTX للتجزئة؛ وEVP_PKEY للمفاتيح غير المتماثلة؛ وسلاسل BIO لتجريد الإدخال والإخراج؛ وSSL_CTX وSSL لاتصالات TLS؛ وتحقق دائمًا من القيم المعادة واستدعِ SSL_get_error؛ وحرّر جميع الكائنات المخصّصة لمنع التسرّبات؛ وتجنب الدوال منخفضة المستوى المهجورة؛ واستخدم مزوّدي OpenSSL 3.0 للامتثال لـ FIPS أو لتسريع الأجهزة.

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

هل درس «واجهة OpenSSL API: البنى الأساسية ومواطن الخلل» مجاني؟

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

ماذا ستتعلم في «واجهة OpenSSL API: البنى الأساسية ومواطن الخلل»؟

تعرّفوا إلى EVP APIs وتجريدات BIO وأكثر أنماط إساءة استخدام OpenSSL API شيوعًا. تتمرن على Cryptology Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «واجهة OpenSSL API: البنى الأساسية ومواطن الخلل»؟

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

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

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

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

  1. libsodium: مكتبة تشفير مقاومة لسوء الاستخدام
  2. واجهة OpenSSL API: البنى الأساسية ومواطن الخلل
  3. Google Tink: تشفير آمن عالي المستوى
  4. تدقيق تبعيات التشفير واختيارها
← العودة إلى Cryptology Academy