تطوير التطبيقات3 دقائق قراءة

لماذا اخترنا تشفير المغلّف بدلًا من SQLCipher لتطبيق مصرفي

SQLCipher هو الإجابة المعتادة لتشفير البيانات المحلية على Android. إليك لماذا اخترنا تشفير المغلّف (Envelope Encryption) لتطبيق مصرفي، والمقايضات التي ترتبت على ذلك.

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

خلال تدقيق أمني ومعالجة لتطبيق Android تابع لبنك تجزئة، اخترنا نهجًا مختلفًا: تشفير المغلّف للقيم الحساسة نفسها، مع حفظ المفاتيح في Android Keystore. في هذا المقال نشرح الخيارين، ولماذا كان تشفير المغلّف مناسبًا لهذا التطبيق، وما الذي تخلّينا عنه في المقابل.


المشكلة: البيانات الحساسة المخزّنة على الجهاز

تخزّن التطبيقات المصرفية البيانات مؤقتًا لتبقى سريعة وقابلة للاستخدام دون اتصال: تفاصيل الحساب، والمعاملات الأخيرة، ومعلومات الملف الشخصي. وإذا بقيت هذه البيانات على الجهاز بصيغة نصية مكشوفة، فقد يكشفها هاتف مُروَّت (rooted) أو نسخة احتياطية أو نسخة جنائية. وفي OWASP Mobile Top 10 (2024)، يندرج ذلك تحت M9: Insecure Data Storage وM10: Insufficient Cryptography.


الخيار 1: SQLCipher

SQLCipher نسخة متفرعة من SQLite تشفّر ملف قاعدة البيانات بالكامل.

  • ميزة: كل شيء مشفّر، بما في ذلك الفهارس والبيانات الوصفية.

  • ميزة: تبقى البيانات المشفّرة قابلة للاستعلام بالكامل.

  • تكلفة: مكتبات أصلية لكل معمارية معالج، تزيد من حجم التطبيق.

  • تكلفة: لا يزال مفتاح قاعدة البيانات بحاجة إلى حماية، وعادةً ما يتولاها Keystore في كل الأحوال.

الخيار 2: تشفير المغلّف

يعمل تشفير المغلّف بمستويين من المفاتيح:

  1. مفتاح تشفير البيانات (DEK) يشفّر القيم الحساسة بخوارزمية تشفير موثَّق مثل AES-GCM.

  2. مفتاح تشفير المفاتيح (KEK) المحفوظ في Android Keystore يغلّف مفتاح DEK. لا ترى شيفرة التطبيق مفتاح KEK أبدًا، وهو مدعوم بالعتاد على الأجهزة التي تدعم ذلك.

📌 فكرة أساسية:

في كلا النهجين، تأتي الحماية الحقيقية من Keystore. والاختيار يتعلق بما تشفّره به: الملف كله، أم القيم المهمة فقط.


لماذا كان تشفير المغلّف مناسبًا لهذا التطبيق

1. معظم البيانات المخزّنة لم تكن حساسة

كان جزء كبير من قاعدة البيانات المحلية يحتوي على إعدادات الواجهة وبيانات أخرى غير حساسة. وقد حمى تشفير القيم الحساسة المحددة ما يهم فعلًا دون تغيير طريقة عمل بقية قاعدة البيانات.

2. حجم التطبيق كان مهمًا

وفّر الاستغناء عن SQLCipher نحو 6.5 ميغابايت من الشيفرة الأصلية. وبالنسبة إلى تطبيق مصرفي يثبّته كثير من المستخدمين على هواتف متوسطة الفئة عبر بيانات الجوال، فهذا فرق ملموس.

3. تكلفة الأداء كانت قابلة للقياس وضئيلة

قسنا العبء الإضافي لفك تشفير القيم التي تعرضها كل شاشة فوجدناه نحو 1 مللي ثانية لكل شاشة، وهو أقل بكثير من أي شيء يمكن أن يلاحظه المستخدم.

4. نموذج مفاتيح واحد لكل شيء

يمكن لنموذج المفاتيح نفسه المدعوم بـKeystore أن يحمي القيم في قاعدة البيانات وفي التفضيلات (preferences) وفي الملفات، بدلًا من وجود آلية منفصلة لكل منها.


المقايضات التي قبلنا بها

  • لا استعلامات على الحقول المشفّرة. لا يمكن البحث في القيم الحساسة أو فرزها أو فهرستها، لذا كان لا بد من تصميم الاستعلامات حول الحقول غير الحساسة.

  • يصبح التصنيف مهمة تصميمية. لا بد أن يقرر أحدهم القيم الحساسة ويوثّقها. وإذا أخطأ، بقيت البيانات بصيغة مكشوفة.

  • البيانات الوصفية غير مشفّرة. تبقى بنية الجداول والأعمدة غير الحساسة قابلة للقراءة.


مقارنة جنبًا إلى جنب

الجانب SQLCipher تشفير المغلّف
ما الذي يُشفَّر ملف قاعدة البيانات بالكامل قيم حساسة مختارة
الاستعلام على البيانات المشفّرة نعم لا
الأثر على حجم التطبيق إضافة مكتبات أصلية أقل بنحو 6.5 ميغابايت في هذا التطبيق
تكلفة وقت التشغيل تشفير كل صفحة من صفحات قاعدة البيانات نحو 1 مللي ثانية لكل شاشة (مقيسة)
الجهد التصميمي منخفض يتطلب تصنيف البيانات
الأنسب لـ بيانات معظمها حساس وقابلة للاستعلام قيم حساسة قليلة ضمن مجموعة بيانات أكبر

كيف تتعامل Mobian مع هذه القرارات

في Mobian، رافقت كلَّ تغيير أمني في ذلك التدقيق مذكرةُ قرار مكتوبة وموجزة: الخطر، والخيارات، وما اخترناه، وما رفضناه. هذا السجل هو ما يتيح لفريق الأمن في البنك، أو لمدققه، أن يفهم لماذا يعمل التطبيق بالطريقة التي يعمل بها. وكنا سنختار SQLCipher بالسهولة نفسها لتطبيق تكون معظم بياناته المحلية حساسة.

الخلاصة

يعتمد كلٌّ من SQLCipher وتشفير المغلّف على Android Keystore لتحقيق حماية حقيقية. ففي تطبيق لا يكون فيه حساسًا إلا جزء من البيانات المحلية، وفّر تشفير تلك القيم مباشرةً 6.5 ميغابايت وكلّف نحو 1 مللي ثانية لكل شاشة، في مقابل تصنيف دقيق للبيانات وعدم إمكانية الاستعلام على الحقول المشفّرة. الإجابة الصحيحة تتوقف على بياناتك، والقرار يستحق أن يُوثَّق كتابةً.

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

ما هو تشفير المغلّف؟

يستخدم تشفير المغلّف (Envelope Encryption) مستويين من المفاتيح. تُشفَّر البيانات باستخدام مفتاح تشفير البيانات (DEK)، ثم يُشفَّر مفتاح DEK نفسه، أو يُغلَّف، باستخدام مفتاح تشفير المفاتيح (KEK). على Android، يمكن حفظ مفتاح KEK في Android Keystore، حيث لا يُكشف أبدًا لشيفرة التطبيق.

هل SQLCipher خيار سيئ؟

لا. SQLCipher أداة ناضجة تشفّر ملف قاعدة البيانات بالكامل، بما في ذلك الفهارس والبيانات الوصفية. وهو مناسب حين تكون معظم قاعدة البيانات حساسة أو حين يجب أن تبقى البيانات المشفّرة قابلة للاستعلام. لكنه يضيف مكتبات أصلية (native) إلى التطبيق ويغيّر طريقة عمل طبقة قاعدة البيانات.

ماذا وفّر تشفير المغلّف في هذا المشروع؟

وفّر الاستغناء عن SQLCipher نحو 6.5 ميغابايت من الشيفرة الأصلية في التطبيق، مقابل تكلفة مقيسة تبلغ نحو 1 مللي ثانية لكل شاشة لتشفير القيم الحساسة التي تعرضها وفك تشفيرها.

ما العيب الرئيسي لتشفير المغلّف على مستوى الحقول؟

لا تستطيع قاعدة البيانات البحث في الحقول المشفّرة أو فرزها أو فهرستها. عليك أن تحدد بعناية القيم الحساسة وأن تصمم الاستعلامات حول الحقول غير الحساسة. أما تشفير قاعدة البيانات كاملةً فيُغنيك عن هذا العمل التصميمي.

هل يستوفي تشفير المغلّف متطلبات OWASP؟

إنه يعالج فئتي التخزين غير الآمن للبيانات والتشفير غير الكافي في OWASP Mobile Top 10 (2024) عند تطبيقه بشكل صحيح، مع مفاتيح مدعومة بالعتاد حيثما توفرت وخوارزمية تشفير موثَّق مثل AES-GCM. أما استيفاؤه لمتطلبات تدقيق بعينه فيتوقف على متطلبات ذلك التدقيق.

تقدير مجاني · دون أي التزام

تخطط لبناء منتج بهذه التقنيات؟

عملنا بالأدوات التي نكتب عنها. أخبرنا عن مشروعك واحصل على رأي ثانٍ من مهندسين أطلقوا منتجات بها.

  • 1نراجع منتجك وتقنياتك وخارطة طريقك
  • 2نوضّح المخاطر التي رأيناها في مشاريع مشابهة
  • 3تحصل على تشكيلة الفريق وجدول زمني تقريبي خلال 48 ساعة

أخبرنا عن مشروعك

تفضّل التحدث أولًا؟ احجز مكالمة مدتها 30 دقيقة