توقيع تطبيق Android: كيف يعمل وسبب أهميته
في كل مرة تقوم فيها بتثبيت تطبيق على هاتف Android الخاص بك، يتم إجراء فحص أمان صامت ولكن مهم في الخلفية. يتحقق هاتفك من التوقيع الرقمي لحزمة APK. إن هذه المصافحة المشفرة هي ما يمنع المتسللين الضارين من "تسميم" تطبيقاتك بالبرامج الضارة مع ضمان قدرة المطورين على دفع التحديثات دون فقدان هويتهم.
إذا كنت تكتب تطبيقات، فإن التوقيع هو شيء عليك ببساطة أن تقوم به بشكل صحيح؛ إذا كنت ترغب فقط في العبث بنظام Android، فهو أحد أكثر أجزاء النظام إرضاءً لفهمه. وفي كلتا الحالتين، كيف يعمل توقيع التطبيق يستحق وقتك. نستعرض أدناه التكنولوجيا، وكيف تطورت مخططات التوقيع، وكيف يمكنك استخدام التحقق يدويا من الشهادات عبر الإنترنت.
- لماذا يجب توقيع كل تطبيق Android وما هو التشفير المتضمن (RSA / EC).
- الفرق بين أنظمة التوقيع v1 (JAR)، وv2، وv3، وv4، وأي منها يجب أن يستخدمه تطبيقك اليوم.
- كيف يقرر Android ما إذا كان سيسمح بالتحديث بناءً على استمرارية التوقيع أم لا.
- كيف يسمح تدوير المفاتيح للمطور بتغيير مفتاح التوقيع الخاص به دون تعطيل عمليات التثبيت الحالية.
- كيفية التحقق من توقيع أي ملف APK بنفسك، من خلال سطر الأوامر أو باستخدام أداة التحقق المستندة إلى المتصفح.
ما هو توقيع التطبيق؟
يعد توقيع التطبيق في جوهره عملية يستخدم فيها المطور مفتاح خاص لإنشاء كتلة توقيع لملفات التطبيق الخاصة به. يتم بعد ذلك تضمين المفتاح العام المقابل في APK داخل المجلد META-INF. عندما يحاول هاتفك تثبيت التطبيق، فإنه يستخدم المفتاح العام للتحقق مما إذا كان التوقيع يطابق محتوى الملف.
وهذا يوفر خاصيتين رئيسيتين:
- الثبات: إذا تم تغيير بايت واحد من كود التطبيق (على سبيل المثال، بواسطة حصان طروادة)، فلن يتطابق التوقيع مع الملف بعد الآن، وسيرفض Android تثبيته.
- إثبات الهوية: إذا حاول أحد التطبيقات تحديث تطبيق موجود، فيجب أن تتطابق توقيعاته. ولهذا السبب لا يمكنك تثبيت تطبيق فيسبوك تم العبث به بدلاً من التطبيق الرسمي.
تطور مخططات التوقيع
قامت Google باستمرار بتحديث آلية التوقيع لتحسين السرعة والأمان:
- V1 (توقيع الجرة): يوقع الملفات الفردية داخل APK (ZIP). وهذا بطيء لأنه يتعين على نظام التشغيل فك ضغط كل ملف والتحقق منه. كما أنه عرضة لبعض عمليات التلاعب بملفات ZIP.
- V2 (نظام توقيع APK): يوقع الكتلة الثنائية الكاملة لملف APK. لا يتطلب الأمر فك الضغط للتحقق، مما يجعله سريعًا بشكل لا يصدق. تم تقديمه في Android 7.0 (Nougat).
- V3 (تدوير المفتاح): يوسع V2 عن طريق إضافة "سلالة" من المفاتيح. فهو يسمح للمطور بإثبات أن المفتاح الجديد هو الوريث المعتمد للمفتاح الأقدم. تم تقديمه في Android 9.0 (Pie).
- V4 (توقيع البث): مصمم خصيصًا لعمليات التثبيت المتزايدة، مما يسمح بالتحقق من التطبيقات أثناء تنزيلها عبر USB أو Wi-Fi.
لماذا تعتبر الشهادات مهمة للتحميل الجانبي
عندما تقوم بتنزيل APK من مصدر غير رسمي، فإن تجزئة الشهادة هو أفضل صديق لك. تحدد بصمة الشهادة (مثل تجزئة SHA-256) بشكل فريد مفتاح التوقيع الخاص بالمطور. يحتفظ كل تطبيق بنفس مفتاح التوقيع عبر جميع تحديثاته، حتى تتمكن من مقارنة بصمة APK بالقيمة المنشورة للمطور للتأكد من أنها أصلية.
إذا كنت تشك في أن ملف APK مزيف، فيجب عليك تشغيله من خلال أداة التحقق من APK عبر الإنترنت. ستظهر لك أداتنا:
- الاسم الشائع (CN) للموقّع (على سبيل المثال، "Android").
- فترة الصلاحية للشهادة.
- بصمات الأصابع SHA-1/SHA-256.
كيف يتحقق Android من التوقيع في وقت التثبيت
غالبًا ما يتم تجاهل خطوة "التحقق من الشهادة" لدرجة أنها تستحق الاطلاع على ما يفعله نظام التشغيل فعليًا عندما تنقر على ملف APK ويقرر Android ما إذا كان سيتم تثبيته أم لا:
- افتح ملف APK كملف ZIP وحدد موقع كتلة التوقيع. بالنسبة لتوقيعات v2/v3 التي تمثل كتلة منظمة مباشرة قبل الدليل المركزي؛ بالنسبة لنظام v1 القديم، فهي محتويات META-INF/*.RSA أو *.DSA أو *.EC.
- حساب ملخصات SHA-256 لكل بايت آخر من ملف APK. تم استبعاد كتلة التوقيع من الملخص الخاص بها؛ يتم تجزئة كل شيء آخر إلى أجزاء محددة.
- تحقق من ملخص كل قطعة مقابل الملخصات المسجلة في كتلة التوقيع. إذا تم تغيير بايت واحد منذ أن قام المطور بتوقيع الملف، فلن تتطابق الملخصات وسيتم رفض التثبيت مع ظهور خطأ عام "التطبيق غير مثبت".
- تحقق من أن كتلة التوقيع نفسها قد تم إنتاجها باستخدام المفتاح الخاص للشهادة. يتم استخدام المفتاح العام للشهادة للتحقق من توقيع التشفير في الكتلة. ويعني الفحص الناجح أن من قام بالتوقيع على الملف يمتلك المفتاح الخاص المقترن بهذه الشهادة.
- قارن بصمة الشهادة بأي تثبيت موجود يحمل نفس اسم الحزمة. إذا كانت الحزمة مثبتة بالفعل وتم توقيع ملف APK الجديد بشهادة مختلفة، فسيتم رفض التثبيت باستخدام INSTALL_FAILED_UPDATE_INCOMPATIBLE. هذا هو الدفاع الرئيسي لنظام التشغيل ضد انتحال الهوية: لا يستطيع أي ممثل خبيث استبدال تطبيق البنك الخاص بك بنسخته الخاصة إلا إذا سرق أيضًا مفتاح التوقيع الخاص بالبنك.
لا شيء من هذا يثبت أن المطور جدير بالثقة، فقط أن الملف الذي أنت على وشك تثبيته مطابق لما قام بالتوقيع عليه وأنه لم يتلاعب به أي طرف آخر. الثقة في المطور هي قرار منفصل، وهو قرار تتخذه من خلال تحديد المصادر التي تقوم بالتثبيت منها.
ماذا يعني "عدم تطابق التوقيع" حقًا؟
المفاجأة الوحيدة الأكثر شيوعًا التي يواجهها الأشخاص عند التحميل الجانبي هي الخطأ "عدم تطابق التوقيع" عند التحديث. وهنا ما يحدث في الواقع:
- لقد قمت بتثبيت التطبيق العاشر الإصدار 1.0 من متجر Play.
- يمكنك تنزيل التطبيق العاشر الإصدار 1.1 من مصدر غير تابع للتشغيل.
- يرى نظام التشغيل نفس اسم الحزمة (com.example.app) ولكن تم توقيع APK بشهادة مختلفة (مفتاح توقيع المصدر الجانبي، وليس مفتاح توقيع الناشر الأصلي). يرفض التثبيت .
يحدث هذا بطريقتين في الممارسة العملية:
- ملف APK الخاص بالجهة الخارجية هو حقا من ناشر مختلف، على سبيل المثال نسخة "معدلة" أو "مصححة". رفض التثبيت هو السلوك الصحيح. إن تثبيته يعني الوثوق بشخص غريب لديه نفس البيانات التي لمسها تطبيق البنك الذي تتعامل معه بالفعل.
- ملف APK التابع لجهة خارجية هو إعادة تحميل APK الرسمي، لكن نظام Play App Signing من Google يوقع تنزيل كل مستخدم باستخدام غلاف مفتاح التحميل الخاص بالمستخدم. يمكن لجهازين في بعض الأحيان رؤية بيانات توقيع مختلفة قليلاً لنفس إصدار التطبيق المفاهيمي. في هذه الحالة، تظل بصمة الشهادة الموجودة في الجذر متطابقة؛ يمكنك التحقق من خلال أداة التحقق من APK لدينا.
إذا كانت بصمة الشهادة حقا تختلف عن التثبيت الحالي لديك، فإن الطريقة الوحيدة للمضي قدمًا هي إلغاء تثبيت النسخة الحالية أولاً (فقدان بياناتها) قبل تحميل النسخة البديلة، وعدم تعطيل التحقق من التوقيع مطلقًا.
إنشاء مفتاح التوقيع الخاص بك (للمطورين)
إذا كنت تقوم بإنشاء تطبيقات Android، فستحتاج في النهاية إلى التوقيع على إصداراتك الخاصة. الأمر القياسي المكون من سطر واحد باستخدام keytool من Java SDK هو:
keytool -genkeypair -v \
-keystore my-release.keystore \
-alias my-app -keyalg RSA -keysize 2048 \
-validity 10000
شيئان يجب معرفتهما:
- أهمية صحة: 10000 يوم (حوالي 27 عامًا) هي القيمة التقليدية لأن نظام التشغيل يتعامل مع التحديثات الموقعة بمفتاح على وشك الانتهاء أو منتهية الصلاحية على أنها مخترقة. أنشئ مفتاحًا طويل العمر مرة واحدة وقم بحمايته.
- بمجرد النشر، لا يمكنك تبديل المفاتيح بسهولة. يضيف نظام التوقيع v3 المفتاح تناوب كميزة واضحة: شهادة قديمة "تبارك" شهادة جديدة من خلال دليل مخزن، مما يسمح لنظام التشغيل بقبول التحديثات من المفتاح الجديد مع الحفاظ على استمرارية الهوية. بدون الإصدار 3، يعني فقدان المفتاح الأصلي عزل جميع عمليات التثبيت الموجودة.
بالنسبة إلى إصدارات الاختبار التي تم تحميلها على الجانب، يعد مخزن مفاتيح تصحيح الأخطاء غير الموقع مناسبًا؛ للإنتاج، استخدم مخزن مفاتيح طويل الصلاحية محمي بكلمة مرور ومخزن في نسخة احتياطية دون اتصال بالإنترنت.
التحقق من هوية التطبيق مثل المحترفين
لا تثق في أسماء الملفات العامة. تحقق من قلب التشفير لملفات APK الخاصة بك في ثوانٍ.
التحقق من الشهادات الآنمخاطر التوقيع الشائعة
- الشهادات الموقعة ذاتيا: معظم تطبيقات Android موقعة ذاتيًا. على عكس SSL لمواقع الويب، لا توجد سلطة مركزية لتوقيع تطبيقات Android. يجب أن تثق بالمطور مباشرة.
- تستخدم تطبيقات شهادات التصحيح: المصممة للاختبار مفتاح "تصحيح" عام. لا ينبغي إطلاقًا إطلاق هذه التطبيقات للعامة، كما يجب حظرها بواسطة العديد من مرشحات الأمان.
- فقدان المفتاح: إذا فقد أحد المطورين مخزن المفاتيح الخاص به، فيمكنه تحديث تطبيقه أبداً مرة أخرى. سيتعين عليهم إصدار تطبيق "جديد" باسم حزمة مختلف.
اختيار نظام التوقيع المناسب لـ SDK المستهدف الخاص بك
يدعم توقيع التطبيق بهدوء قدرًا كبيرًا من الأمان في Android. بمجرد النقر على علاقة المفاتيح الخاصة/العامة، يمكنك الحكم على التطبيق الذي تم تحميله على الجانب بناءً على مزاياه والتأكد من أن ما تقوم بتثبيته لم يتغير منذ توقيع المطور عليه. لمعرفة المزيد عن الأجزاء الداخلية لنظام Android، راجع دليل إلى تنسيق XAPK.