نَستعرِض في هذه المقالة أساسيات التشفير.
وهي مقالة أولى تفتتح سلسلة مقالات حول كيفية استخدام التشفير في أجهزة لينكس المُدْمَجة.
في الجزء الأول بين يديك، سأغطي المفاهيم الأساسية وسأعطي مُقدِّمة عن الأمن، والسرِّية، والتشفير، والدوافع الرئيسية للتشفير وكيف يعمَل، وأنواع التشفير (التشفير بالمفتاح المتماثل وغير المتماثل)، بالإضافة إلى المرور على أكثر خوارزميات التشفير شيوعًا وسأقارن بينها.
ورغم أنَّني أُركِّز هنا على «لينكس» المُدْمَج، إلّا أن المفاهيم في سلسلة المقالات هذه يُمكن أن تُطبَّق في جميع أنواع المشاريع، وقد تكون مفيدة لأي شخص يتعامل مع التشفير على الأجهزة المُدْمَجة.
إذا كنت تُفضِّل محاضرة مدتها ساعة بدلاً من أن تَقرأ هذه المقالة، يمكنك أن تُشاهد المحاضرة بعنوان مقدمة في تقنيات التشفير لأنظمة لينكس المُدْمَجة التي قُدِّمت في مؤتمر Embedded Online ٢٠٢١.
والآن، لنبدأ بمقدمة موجَزة عن الأمن والتشفير...
الأمن والتشفير
الهدف الأساسي من أمن المعلومات هو تقليل المخاطر. لنفرِض أن لديك شيئًا يحتاج إلى حماية — لنُسمِّه أصل— لأنه يحمل قيمة. إنْ تَجاوزَت قيمة هذا الأصل تكاليفَ حمايته، فمن المرجَّح أن تكرِّس موارد للحد من احتمال أن يَتعرَّض للاختراق. ويُعدُّ التشفير أحد الأساليب العديدة للتخفيف من المخاطر.
في مجال الأمن، يَحِّل التشفير مشكلة سرِّية المعلومات. وِفقًا لموسوعة ويكيبيديا، تُعرَّف السرِّية بأنها ”الخاصية التي تَمنَع إتاحة المعلومات أو إفشائها لأي أفرادٍ أو كيانات أو عمليات غير مخولة“.
إذًا، ما الداعي للاهتمام بسرِّية المعلومات في الأجهزة المُدْمَجة؟ في الواقع، هناك بضعة أسباب.
سرِّية المعلومات في الأجهزة المُدْمَجة
قد نرغَب أن نَحمي الجهاز من التزييف (مثل حماية الملكية الفكرية). بِفْضْل الأدوات المتاحة لنا اليوم، أصبح من السهل جدًا أن نَستخرِج البرمجية الثابتة من وحدات التخزين (مثل الأقراص أو ذاكرة الفلاش وغيرها). لا يوجد شيء محصن تمامًا، لكن تشفير البرمجية يَجعل اختراقها أصعب بكثير (مثلما سترى لاحقًا، هذا يعتمد أساسًا على مدى أمن مفتاح التشفير داخل الجهاز).
ومن الدوافع الجيِّدة الأخرى للتشفير: حماية المعلومات الحسّاسة المُخزَّنة على الجهاز (مثل بيانات التشغيل، وبيانات المستخدم، وغيرها)، سواءً لأسباب تتعلق بالخصوصية أو غيرها. في الواقع، واعتمادًا على نوع المنتج الذي نُطوِّره (مثل الأجهزة الطبية)، هناك معايير أو لوائح تنظيمية يجب أن نَلتزِم بها، مما يَجعل سرِّية البيانات متطلبًا إلزاميًا.
بالإضافة إلى حماية المعلومات الحسّاسة، قد يَمنَع التشفير الجهات الخبيثة من أن تَستخرِج «الكود» لغاية استخدامه في هندسة عكسية. يُعقّد التشفير على المعتدي استكشاف الثغرات الأمنية في البرمجيات الثابتة، وإن كان لا يمنعها تمامًا.
وهذا غيضٌ من فيض الأسباب التي قد تَدفعنا للاهتمام بسرِّية «الكود» والبيانات على جهاز «لينكس» مدمَج.
سرِّية «الكود» والبيانات
الهدف الأساسي من سرِّية «الكود» هو حماية «الكود» البرمجي من الوصول غير المصرَّح به. قد يكون هذا الكود برمجية ثابتة مخصصة (bare-metal firmware) لمشروع يعتمد على متحكِّم دقيق (microcontroller)، أو نظام تشغيل كامل لمشروع يعتمد على معالِج دقيق (microprocessor).
في أنظمة «لينكس»، قد تَرغَب في حماية محمِّل الإقلاع (bootloader)، أو نواة لينكس (Linux kernel)، أو نظام الملفات الجذر (root filesystem)، أو أي قسم آخر تخزَّن فيه تطبيقاتك. على الرغم من أن الحِفاظ على سريّة «الكود» ليس أمرًا شائعًا كما هو الحال مع سريّة البيانات، إلّا أنه قد يكون مُتطلَّبًا ضروريًا لبعض أنواع المنتجات.
عندما تَستخدِم برمجيات مفتوحة المصدر، انتبه جيدًا لتراخيص البرمجيات عند تشفير «الكود». فما الفائدة من تشفير «كود» يستَعمِل رُخصة GPL إذا كنت مضطرًا لإصداره على أي حال؟ . كما أن ترخيص GPLv3 يمثِّل تحدّيًا خاصًا بسبب مشكلة التصميم التيفوية (Tivoization).
في النهاية، للحفاظ على سرِّية «الكود» عليك أن تُشفِّر تطبيقاتك الخاصة فقط (أي ملكيتك الفكرية).
ماذا عن سرّية البيانات؟ تهدف سرّية البيانات لحمايتها وهناك ثلاثة أنواع رئيسية من البيانات التي قد تحتاج لحماية خاصّة:
أولها هي البيانات المخزَّنة فعليًا على الجهاز بأي شكل رقمي (وغالباً ما نُطلِق على هذا النوع من البيانات اسم البيانات الساكنة data at rest).
النوع الثاني هو البيانات التي تدخُل الجهاز أو تخرج منه عبر أي نوع من الشبكات (ويُطلَق عليها عادةً اسم البيانات المتنقلة أو data in transit أو data in motion أو data in flight).
والثالث هو البيانات المُخزَّنة في وحدات التخزين غير الدائمة مثل الذاكرة العشوائية (RAM)، أو ذاكرة التخزين المؤقت للمعالج (CPU caches)، أو سجلات المعالج (CPU registers)، وغيرها.
الآن بعد أن فَهِمنا معنى سرِّية «الكود» والبيانات، يبقى السؤال: كيف يمكننا أن نحلّ هذه المشكلة؟
كيف يمكن أن نضمن سرِّية البيانات في نظام مُدْمَج؟
يمكن أن تُطبَّق عدة تقنيات عند تصميم جهاز مُدْمَج لحلِّ مشكلة السرِّية، من بينها: التخويل (Authorization)، والحماية من التلاعب (Tampering)، والتشفير (Encryption).
يقيّد التخويل الوصول إلى المعلومات وفق آلية مصادقة معينة. على سبيل المثال، لحماية البيانات المخزَّنة في الجهاز، يمكنك أن تُوفِّر آلية مصادقة عند تسجيل دخول تَطلُب من المُستَخدِم أن يُدخِل اسمه وكلمة المرور للوصول إلى البيانات.
غالبًا ما تَشمَل الحماية من التلاعب وسيلة فيزيائية تَمنَع الوصول غير المصرَّح به. على سبيل المثال، لحماية «الكود»، يمكن أن تُصمِّم جهازًا يَمسَح البرمجية الثابتة تلقائيًا عند تشغيله أو التلاعب به.
وأخيرًا، هناك التشفير، وهو التقنية التي سنركِّز عليها من الآن فصاعدًا. التشفير هو عملية تحويل البيانات إلى شكل غير قابل للقراءة إلا لمن يَملِك سرًّا معيّنًا (كلمة مرور، مفتاح تشفير، وما إلى ذلك).
التشفير، باختصار
التشفير هو عملية ترميز المعلومات بطريقة تجعلها غير قابلة للقراءة أو غير مفهومة لأي شخص يتنصَّت أو يحاول الوصول إليها دون تخويل.
يستخدم التشفير خوارزمية تُعرَف باسم cipher لتحويل التمثيل الأصلي للمعلومة (النص الصريح – plaintext) إلى شكل بديل وغير مقروء (النص المُشفَّر – ciphertext). ويُستَخدم في هذه العملية سرّ (أي مفتاح)، يَمنع من عَودة النص المُشفَّر مرة أخرى إلى شكله الأصلي إلّا للأطراف المصرَّح لها والتي تَعرِف هذا السر أو تمتلكه.
إحدى أبسط وأقدم تقنيات التشفير هي شيفرة قيصر (Caesar Cipher)، والتي تَعمَل ببساطة عبر تحريك كل حرف في النص الأصلي بمقدار معين في الأبجدية من أجل توليد النص المُشفَّر.
على سبيل المثال، لنفترض أنك تريد تشفير كلمة: مدمج
| النص الأصلي (غير المُشفَّر) | خوارزمية التشفير | مفتاح الشيفرة | النص المُشفَّر |
| مدمج | شيفرة قيصر | ٣ | وزود |
في هذا المثال، استخدمنا شيفرة قيصر، والمفتاح (أو السر) هو الرقم ٣. هذا يعني أن النص المُشفَّر يُولَّد بإزاحة كل حرف في النص الأصلي ٣ مرات.
المفتاح هو السرّ! (حرفيًّا ومجازيًّا) ;)
المفاتيح والتشفير
تَعتمِد عملية تشفير الرسائل وفك تشفيرها على استخدام مفاتيح. وهناك نوعان رئيسيان من مفاتيح التشفير: المفاتيح المتماثلة والمفاتيح غير المتماثلة.
في أنظمة التشفير بمفتاح متماثل، يُستخدَم نفس المفتاح (ويُطلق عليه غالبًا مفتاح خاص أو سرّي) في عمليتي التشفير وفكّ التشفير.
أما في أنظمة التشفير بمفتاح غير متماثل (ويُطلق عليه أيضًا مفتاح عام)، يُستخدَم زوج من المفاتيح (يشار إليهم بالعادة بالمفتاح العام والخاص)، إذ يمكن فكّ تشفير البيانات التي تَستخدِم المفتاح العام فقط بالمفتاح الخاص، والعكس صحيح.
تُعَدّ الخوارزميات التي تَعتمِد على المفاتيح المتماثلة أبسط وأسرع وأكثر كفاءة في العادة. لكن يَكمُن التحدي في تخزين المفتاح بشكل آمن؛ فإذا تَسرَّب المفتاح، لم يعد للقفل قيمة!
تَقِل حدّة هذه الإشكالية في خوارزميات التشفير بالمفتاح العام، نظرًا لعدم الحاجة إلى مشاركة المفتاح الخاص. من ناحية أخرى، تُعَدّ خوارزميات التشفير بالمفتاح العام أكثر تعقيدًا وأبطأ في الأداء، مما يُصعِّب استخدامها عند الحاجة إلى تشفير كميات كبيرة من البيانات.
في النهاية، هناك مفاضلات بين هذين النوعين من التشفير، كما يتضح في الجدول أدناه:
| وجه المقارنة | مفتاح متماثل | مفتاح غير متماثل |
| المفاتيح | مفتاح واحد فقط (خاص) | مفتاحان (عام وخاص) |
| درجة التعقيد | أقلّ | أعلى |
| السرعة | أسرع | أبطأ |
| استهلاك الموارد | أقلّ | أعلى |
| طول المفاتيح | عادةً ١٢٨ أو ٢٥٦ بت | ٢٠٤٨ بت أو أكثر |
| الاستخدام | يُشفِّر كميات كبيرة من البيانات | يُشفِّر كميات صغيرة من البيانات |
| درجة الأمان | أقلّ | أعلى |
| خوارزميات التشفير | شفرات الكتل (AES, DES, 3DES)، شفرات التدفق (RC4). | RSA، التشفير المنحنى الإهليجي (ECC)، وDSA، ديفي-هيلمان (لتبادل المفاتيح) |
عمليًا، كل مفتاح له استخداماته المثلى، وليس هناك خيار واحد أمثل لجميع الحالات. في الواقع، يُكمِّل كل منهما الآخر، وغالبًا ما يُستَخدَمان معًا لحلّ مشكلة معينة.
على سبيل المثال، قد يَستَخدم طرفان يرغبان في تبادل البيانات خوارزمية تشفير بمفتاح غير متماثل لتبادل مفتاح خاص، ثم يستخدِمان هذا المفتاح الخاص في خوارزمية تشفير بمفتاح متماثل لتشفير البيانات وتبادلها (وهذا هو جوهر عمل بروتوكول طبقة المقابس الآمنة (SSL) وبروتوكول أمان طبقة النقل (TSL)!).
تمت إعادة نشر هذا المقال وفقاً لرخصة المشاع الإبداعي - Creative Commons، للإطلاع على المقال الأصلي.

