Code Signing — ما هو، توقيع الكود وكيف يعمل

المؤلف: IT Sectr نُشر: 2026-04-16 وقت القراءة: 9 دق

Code Signing (توقيع الكود) — آلية توقيع رقمي للملفات التنفيذية تضمن أصالة المطور وسلامة التطبيق. في Android، يجب توقيع كل ملف APK بشهادة قبل التثبيت على الجهاز أو النشر في Google Play. وفقًا لـ Google، 2024، يدعم Android أربعة أجيال من مخططات التوقيع: من v1 القائم على JAR إلى v4 للتثبيت التدفقي.

النقاط الرئيسية

  • Code Signing — توقيع رقمي للكود يؤكد التأليف وسلامة التطبيق.
  • في Android، يتم التوقيع عبر keystore — مخزن للمفاتيح والشهادات.
  • المخطط v2 (APK Signature Scheme) — المعيار الرئيسي منذ Android 7.0، الذي يحمي جميع بايتات APK.
  • تدوير المفاتيح (v3، Android 9.0+) يسمح بتغيير مفتاح التوقيع دون حذف التطبيق.
  • يستخدم Google Play Play App Signing للإدارة المركزية للمفاتيح.

ما هو Code Signing؟

Code Signing — عملية تشفيرية يوقع فيها المطور الكود القابل للتنفيذ بشهادته الرقمية. يتم إنشاء التوقيع باستخدام التشفير غير المتماثل: المفتاح الخاص للمطور يولد توقيعًا رقميًا، والمفتاح العام يُضمن في الشهادة. يمكن لأي شخص التحقق من التوقيع باستخدام المفتاح العام، لكن تعديل الكود دون كسر التوقيع مستحيل.

في تطوير التطبيقات المحمولة، توقيع الكود يؤدي ثلاث وظائف. الأولى — المصادقة: يمكن للمستخدم والمنصة تحديد مطور التطبيق. الثانية — السلامة: أي تغيير في APK بعد التوقيع يبطل التوقيع. الثالثة — التحديث الموثوق: تسمح المنصة بتحديث التطبيق فقط بتلك APKs الموقعة بنفس شهادة النسخة المثبتة.

الوضع القانوني

التوقيع الرقمي لتطبيقات Android له أهمية قانونية. وفقًا للتشريع الروسي (63-FZ) والأوروبي eIDAS، التوقيع الإلكتروني المؤهل يعادل التوقيع بخط اليد. ومع ذلك، توقيع APK بشهادة ذاتية التوقيع (ممارسة شائعة في Android) ليس مؤهلاً — فهو يؤكد السلامة، ولكن ليس هوية المطور من الناحية القانونية.

مخططات توقيع Android: v1، v2، v3، v4

Android يدعم أربعة مخططات لتوقيع APK، كل منها يحل مشاكل الإصدار السابق ويضيف إمكانيات جديدة. يمكن لجميع المخططات التعايش في APK واحد — هذا ضروري للتوافق مع الإصدارات القديمة من Android.

ظهر المخطط v1 (JAR signing) في Android 1.0. يوقع ملفات فردية داخل أرشيف APK باستخدام إدخالات في META-INF/MANIFEST.MF. العيب: يمكن للمهاجم تعديل APK (إضافة أو إزالة ملفات) وإعادة توقيع الملفات المعدلة فقط دون المساس بالباقي. هذا يجعل v1 عرضة لبعض الهجمات. المخطط v2 (APK Signature Scheme)، المقدم في Android 7.0، يوقع ملف APK بأكمله ككل، بما في ذلك جميع البايتات باستثناء التوقيع نفسه، مما يلغي إمكانية التعديل الانتقائي.

المخططAndroidالميزةتدوير المفتاح
v1 (JAR)1.0+توقيع كل ملفلا
v27.0+توقيع APK بالكامللا
v39.0+توقيع + تدويرنعم
v411.0+تدفق + ADBنعم

v3: تدوير مفتاح التوقيع

المخطط v3، المقدم في Android 9.0، يحل مشكلة قديمة: ماذا تفعل إذا تم اختراق مفتاح التوقيع أو انتهت صلاحيته؟ سابقًا، كان تغيير مفتاح التوقيع يعني أن التطبيق يُعامل كجديد — لا يمكن تثبيته فوق تطبيق موجود. يضيف v3 آلية التدوير: يمكن تضمين دليل التدوير (proof-of-rotation) في APK، موقعًا بالمفتاح القديم. يتحقق النظام من السلسلة ويسمح بتحديث التطبيق الموقع بالمفتاح الجديد.

Keystore والشهادات

Keystore — حاوية آمنة تحتوي على المفاتيح الخاصة والشهادات لتوقيع التطبيقات. في تطوير Android، يُستخدم تنسيق JKS (Java KeyStore) أو PKCS12. يتم إنشاء keystore باستخدام أداة keytool المضمنة في JDK. يتم تحديد كل مفتاح في المخزن بواسطة اسم مستعار (alias) ومحمي بكلمة مرور.

تحتوي الشهادة في keystore على المفتاح العام ومعلومات المالك: اسم المؤسسة، البلد، فترة الصلاحية. لتطبيقات Android، يمكن أن تكون الشهادة ذاتية التوقيع — Google لا تطلب سلطة التصديق (CA)، مما يميز Android عن iOS. ومع ذلك، يجب أن تكون صلاحية الشهادة 25 عامًا على الأقل، لأن التطبيق سيتم تحديثه بنفس المفتاح.

bash
# إنشاء keystore جديد للتوقيع
keytool -genkey -v -keystore my-release.keystore \
        -alias my-app-alias \
        -keyalg RSA \
        -keysize 2048 \
        -validity 10000

# عرض محتويات keystore
keytool -list -v -keystore my-release.keystore

تنسيقات المفاتيح

يدعم Android خوارزميتين لمفاتيح التوقيع: RSA و ECDSA. RSA بحجم مفتاح 2048 بت — المعيار الفعلي، المدعوم من جميع إصدارات Android. ECDSA (خوارزمية التوقيع الرقمي بالمنحنيات الإهليلجية) مع منحنى P-256 توفر نفس القوة التشفيرية بحجم مفتاح أصغر. منذ Android 9.0، يُوصى باستخدام ECDSA لأنه أسرع في التحقق على الأجهزة المحمولة.

تكوين التوقيع في البناء

في Android Gradle Plugin، يتم تكوين التوقيع عبر كتلة signingConfigs في build.gradle على مستوى الوحدة. لبنيات التصحيح، يقوم Android Studio تلقائيًا بإنشاء keystore تصحيح بكلمات مرور معروفة. لبنيات الإصدار، يحدد المطور المسار إلى keystore الخاص به، والاسم المستعار للمفتاح وكلمات المرور. يُوصى بتخزين كلمات المرور في ملفات تكوين منفصلة مستبعدة من نظام التحكم في الإصدارات.

الممارسة الحديثة — إدارة التوقيع المركزية عبر CI/CD. يمكن لـ Jenkins أو GitLab CI أو GitHub Actions تخزين keystore كقطعة أثرية محمية وكلمات المرور كأسرار بيئة. هذا يمنع تسرب المفاتيح عبر المستودع ويبسط تدوير المفاتيح عند الحاجة.

groovy
// build.gradle (مستوى التطبيق) — تكوين التوقيع
android {
    signingConfigs {
        release {
            storeFile file("my-release.keystore")
            storePassword System.getenv("KEYSTORE_PASSWORD")
            keyAlias System.getenv("KEY_ALIAS")
            keyPassword System.getenv("KEY_PASSWORD")
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

التوقيع بمخططات متعددة

لأقصى توافق، يجب توقيع APK بالمخططات الثلاثة (v1 + v2 + v3). Android Gradle Plugin يتضمن جميع المخططات افتراضيًا. APK الموقع بـ v2 فقط لن يتم تثبيته على Android 6.0 وما دونه. APK بـ v1 فقط لن يحصل على فوائد السلامة من v2 على Android 7.0+. تضمين جميع المخططات لا يزيد حجم APK بأكثر من 1-2% ويضمن التوافق مع أي جهاز.

Play App Signing وإدارة المفاتيح

Play App Signing — خدمة Google Play التي تدير مركزيًا مفاتيح توقيع التطبيقات. يقوم المطور بتحميل APK موقع بمفتاح تحميل (upload key) إلى Google Play Console، ويعيد Google Play توقيعه بمفتاح توزيع (distribution key) قبل تسليمه للمستخدمين. هذا يحمي مفتاح التوزيع من الفقدان أو الاختراق.

مزايا Play App Signing: الأمان — يُخزن مفتاح التوزيع في تخزين Google المحمي؛ التدوير — يمكن طلب تغيير المفتاح عبر لوحة التحكم؛ الاسترداد — عند فقدان مفتاح التحميل، يمكن إنشاء مفتاح جديد. العيب: للتطبيقات التي كانت موجودة قبل تقديم Play App Signing، يتطلب الانتقال إنشاء تطبيق جديد، لأن مفتاح التوزيع القديم قيد الاستخدام بالفعل.

bash
# الحصول على بصمة الشهادة (SHA-256)
keytool -list -v -keystore my-release.keystore \
        -alias my-app-alias | grep "SHA256"

# التحقق من توقيع APK باستخدام apksigner
apksigner verify --verbose app-release.apk

استرداد المفتاح

إذا فقد مفتاح التوقيع ولم يُستخدم Play App Signing، فمن المستحيل استعادة القدرة على تحديث التطبيق — سيتعين إنشاء تطبيق جديد باسم حزمة جديد. هذا أحد الأسباب الرئيسية لاستخدام Play App Signing. توصي Google بالاحتفاظ بنسخة احتياطية من keystore في تخزين آمن غير متصل (محرك أقراص USB مشفر، صندوق أمان بنكي).

التحقق من التوقيع على الجهاز

عند تثبيت APK، يقوم Android بالتحقق من التوقيع على عدة مراحل. الأولى — فحص الشهادة: هل انتهت صلاحيتها، هل التنسيق صحيح. الثانية — التحقق من التوقيع: هل يتطابق التوقيع التشفيري مع محتوى APK. الثالثة — مقارنة الشهادة بالنسخة المثبتة: إذا كان التطبيق موجودًا بالفعل على الجهاز، يجب أن تتطابق الشهادة، وإلا يتم حظر التثبيت.

نظام التحقق مدمج في PackageManagerService. عند معالجة طلب التثبيت، يستخرج PMS التوقيع من APK، ويتحقق منه باستخدام الفئة android.util.PackageParser ويقارنه بالتوقيع المحفوظ للتطبيق المثبت (إذا كان موجودًا). في حالة عدم التطابق، يحصل المستخدم على خطأ “INSTALL_FAILED_UPDATE_INCOMPATIBLE”. هذه الآلية تمنع هجمات الاستبدال (لا يمكن للبرامج الضارة استبدال تطبيق شرعي بنسختها الخاصة).

التحقق من قبل المطور

يمكن للمطور التحقق بشكل مستقل من توقيع APK باستخدام أداة apksigner من أدوات بناء Android SDK. الأمر apksigner verify --verbose app.apk يظهر بأي مخططات تم توقيع APK، وما إذا كانت الشهادات صالحة وما إذا كانت التواقيع تطابق المحتوى. للتحقق البرمجي من توقيع تطبيق مثبت، يُستخدم PackageManager.getPackageInfo() مع العلم GET_SIGNATURES.

kotlin
// التحقق البرمجي من توقيع تطبيق مثبت
fun getAppSignature(context: Context, packageName: String): String? {
    val pm = context.packageManager
    val info = pm.getPackageInfo(
        packageName,
        PackageManager.GET_SIGNATURES
    )
    return info.signatures?.firstOrNull()?.toCharsString()
}

أفضل ممارسات أمان التوقيع

أمان مفتاح التوقيع — جانب حاسم في تطوير Android. اختراق المفتاح يسمح للمهاجم بتوقيع تحديثات تطبيقك بكود خاص به. القواعد الرئيسية: لا تخزن المفتاح أبدًا في المستودع، لا تستخدم مفتاحًا واحدًا لتطبيقات مختلفة، لا تنقل المفتاح عبر قنوات غير آمنة (بريد إلكتروني، تطبيقات مراسلة).

الممارسة الموصى بها — فصل المفاتيح. استخدم مفتاحًا منفصلاً لكل تطبيق ومفتاحًا منفصلاً للتحميل إلى Google Play (upload key). لبنيات التصحيح، يقوم Android Studio بإنشاء debug.keystore مشترك — لا يمكن استخدامه لبنيات الإصدار. يجب أن تكون صلاحية الشهادة 25-30 عامًا (المعيار الحالي، المؤكد من Google).

الممارسةالتوصية
تخزين المفتاحوسيط مشفر، أسرار CI/CD
صلاحية الشهادة25 عامًا على الأقل
الخوارزميةRSA 2048+ أو ECDSA P-256
الفصلمفتاح منفصل لكل تطبيق
النسخ الاحتياطينسخة غير متصلة من keystore

تدقيق التواقيع

تحقق بانتظام من سلامة سلسلة التوقيع. عند مغادرة الموظفين الذين لديهم وصول إلى المفاتيح، قم بتحديث مفتاح التحميل عبر Google Play Console. استخدم أدوات مثل Google Play Integrity API للتحقق من أن تطبيقك لم يتم العبث به على أجهزة المستخدمين. يعيد API بيانات حول التوقيع والسلامة، ويرسلها إلى الخادم للتحقق.

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

ما هو Code Signing في Android؟

Code Signing — توقيع رقمي لملف APK يؤكد أن التطبيق تم إنشاؤه بواسطة مطور معين ولم يتم تعديله بعد التوقيع. بدون توقيع، لن يتم تثبيت APK على الجهاز.

كيف يتم إنشاء مفتاح لتوقيع تطبيق Android؟

استخدم أداة keytool من JDK: keytool -genkey -v -keystore my-release.keystore -alias my-alias -keyalg RSA -keysize 2048 -validity 10000. حدد keystore الناتج في build.gradle في كتلة signingConfigs.

ماذا يحدث إذا فقدت مفتاح التوقيع؟

إذا فقد المفتاح ولم تستخدم Play App Signing، يصبح تحديث التطبيق مستحيلاً. سيتعين إنشاء تطبيق جديد في Google Play باسم حزمة جديد. استخدم Play App Signing للحماية من فقدان المفتاح.

ما الفرق بين مخططي التوقيع v1 و v2؟

v1 يوقع كل ملف داخل APK بشكل فردي — يمكن للمهاجم تعديل ملف واحد وإعادة توقيعه فقط. v2 يوقع APK بأكمله ككل — أي تغيير يبطل التوقيع، مما يوفر مستوى أعلى من الأمان.

ما هو Play App Signing؟

Play App Signing — خدمة Google Play التي تخزن مركزيًا مفتاح توزيع التطبيقات. يقوم المطور بتحميل APK موقع بمفتاح تحميل، ويعيد Google توقيعه قبل التسليم للمستخدمين، مما يحمي المفتاح من الفقدان أو السرقة.

الملخص

  • Code Signing — توقيع رقمي إلزامي لـ APK، يضمن أصالة وسلامة التطبيق.
  • يدعم Android أربعة مخططات توقيع: v1 (JAR)، v2 (APK Signature)، v3 (تدوير المفاتيح) و v4 (تدفق).
  • Keystore — حاوية مفاتيح آمنة يتم إنشاؤها عبر keytool بخوارزمية RSA 2048+.
  • تدوير المفاتيح (v3، Android 9.0+) يسمح بتغيير مفتاح التوقيع دون حذف التطبيق.
  • Play App Signing يدير مركزيًا مفاتيح التوزيع عبر Google Play Console.
  • التحقق من التوقيع أثناء التثبيت يمنع هجمات الاستبدال: عدم تطابق الشهادة = خطأ INSTALL_FAILED.
  • أمان المفتاح: مفتاح منفصل لكل تطبيق، صلاحية 25+ عامًا، نسخة غير متصلة، لا مفاتيح في المستودع.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا