أحدث المقالات
JOURNAL INDEX
تطوير تطبيقات الموبايل/2026.10.26/52 VIEWS/5 MIN READ

تخزين الرموز السرية في تطبيقات الموبايل: Android Keystore وiOS Keychain

عبدالرحمن ربيع علي
عبدالرحمن ربيع علي Software Engineer & AI Builder

دليل عملي لتخزين رموز الدخول بأمان في تطبيقات أندرويد وآيفون، مع فهم Keychain وKeystore ودورة حياة الرموز والاختبارات الأمنية.

تخزين الرموز السرية في تطبيقات الموبايل: Android Keystore وiOS Keychain

تخزين الرموز السرية في تطبيقات الموبايل: دليل Android Keystore وiOS Keychain

تحتاج تطبيقات الموبايل غالبًا إلى الاحتفاظ ببيانات تساعد المستخدم على البقاء مسجلًا للدخول، مثل refresh token أو مفتاح جلسة. لكن تخزين هذه القيم في المكان الخطأ قد يحوّل الهاتف المفقود، أو نسخة احتياطية غير محمية، أو جهازًا مخترقًا إلى نقطة تسريب للحسابات. الحل ليس إخفاء القيمة داخل الكود أو تشفيرها بمفتاح ثابت داخل التطبيق؛ بل تصميم دورة حياة واضحة للأسرار والاستفادة من آليات النظام المخصصة لها.

يشرح هذا الدليل الفرق بين التخزين العادي والتخزين المدعوم من نظام التشغيل، وكيفية التفكير في Android Keystore وiOS Keychain، وما الذي ينبغي تخزينه، ومتى تُحذف الرموز، وكيف تختبر حالات الفشل. الأمثلة توضيحية ويجب تكييفها مع إطار التطبيق وإصدارات أنظمة التشغيل المستهدفة.

الخلاصة السريعة: خزّن أقل قدر ممكن من الأسرار، واجعل الوصول إليها عبر واجهة واحدة، واستخدم مخازن النظام الآمنة، وحدد انتهاء الصلاحية والإبطال على الخادم. التخزين الآمن يقلل المخاطر لكنه لا يجعل الجهاز المخترق آمنًا بالكامل.

ما الذي يُعد سرًا داخل تطبيق الموبايل؟

ليست كل البيانات المخزنة متساوية في حساسيتها. إعدادات الواجهة، واللغة، وحالة الشاشة المؤقتة لا تحتاج عادةً إلى الحماية نفسها التي تحتاجها بيانات الاعتماد. تشمل الأسرار المحتملة access tokens وrefresh tokens ومفاتيح التشفير الخاصة بالمستخدم وبيانات اعتماد الأجهزة. أما كلمات المرور، فمن الأفضل عمومًا ألا يحتفظ بها التطبيق أصلًا؛ استخدم تدفق مصادقة مناسبًا بدلًا من إعادة تخزين كلمة المرور.

القاعدة العملية هي تصنيف البيانات قبل اختيار مكان التخزين. اسأل: هل تسمح هذه القيمة بانتحال هوية المستخدم؟ هل يمكن استخدامها للوصول إلى بيانات أخرى؟ هل لها صلاحية قصيرة؟ هل يمكن إبطالها عن بُعد؟ كلما زادت قدرة القيمة على منح الوصول، زادت ضرورة تقليل تعرضها وتقليل مدة استخدامها.

التخزين العادي ليس خزنة أسرار

تُستخدم SharedPreferences وملفات الإعدادات وقواعد البيانات المحلية لتخزين بيانات التطبيق، لكنها ليست بديلًا مباشرًا عن مخازن الأسرار. وقد تُنسخ البيانات إلى نسخ احتياطية أو تظهر في سجلات التصحيح أو تصبح قابلة للقراءة في ظروف اختراق الجهاز. وحتى لو كان الملف داخل مجلد التطبيق، فهذا لا يضمن حمايته في كل نموذج تهديد.

تشفير الملف قد يساعد، لكن السؤال الحاسم هو أين يوجد مفتاح التشفير. إذا كان المفتاح الثابت مضمّنًا داخل التطبيق، يستطيع مهاجم يملك التطبيق تحليله واستخراجه أو استدعاء الكود لفك البيانات. لذلك يجب أن يكون المفتاح مُدارًا من النظام، لا سلسلة سرية مخبأة في المصدر.

Android Keystore: إدارة المفاتيح بدل تخزين النصوص

يوفر Android Keystore واجهة لإنشاء مفاتيح تشفير وإدارتها بحيث لا يحتاج التطبيق إلى قراءة مادة المفتاح الخاصة مباشرة. وقد تكون المفاتيح محمية ببيئة تنفيذ موثوقة أو عتاد آمن بحسب الجهاز وقدراته. لا تفترض أن كل هاتف يملك المستوى العتادي نفسه؛ افحص القدرات عند الحاجة وصمّم سلوكًا بديلًا مناسبًا.

من المهم التمييز بين Keystore ومخزن القيمة نفسها. غالبًا ما يُستخدم Keystore لحماية مفتاح يُشفّر به عنصر حساس محفوظ في تخزين التطبيق، بينما قد تستخدم مكتبة موثوقة تخزينًا آمنًا يربط القيمة بآلية النظام. لا يعني اسم Keystore أن بإمكانك وضع أي نص فيه كأنه قاعدة بيانات عامة.

اختيار القيود المناسبة للمفتاح

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

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

iOS Keychain: تخزين بيانات الاعتماد مع سياسة وصول

يُستخدم Keychain في iOS وiPadOS لتخزين عناصر صغيرة حساسة مثل الرموز وبيانات الاعتماد والمفاتيح. تتيح خصائص الوصول تحديد متى يمكن قراءة العنصر، وما إذا كان مرتبطًا بالجهاز أو قابلًا للمزامنة عبر الأجهزة، وما إذا كان يتطلب حضور المستخدم. يجب أن يتوافق الاختيار مع حاجة المنتج: لا تفعّل المزامنة لمجرد أنها متاحة إذا كان نسخ السر إلى جهاز آخر غير مرغوب.

اختيار مستوى الحماية قرار منتج وأمن معًا. فالعنصر الذي يجب أن يبقى متاحًا بعد إعادة تشغيل الهاتف يختلف عن عنصر لا يُقرأ إلا والجهاز مفتوح. اقرأ توثيق Apple الخاص بفئات Keychain وسمات الوصول قبل اختيار الإعدادات النهائية، واختبر السلوك على إصدارات النظام التي تدعمها.

حالات حذف التطبيق وإعادة التثبيت

لا تبنِ افتراضات غير مختبرة حول بقاء عناصر Keychain أو اختفائها بعد حذف التطبيق وإعادة تثبيته؛ يعتمد السلوك على نوع العنصر وإعداداته وسياق النظام. إذا كان المنتج يتطلب تسجيل خروج كاملًا، فاحذف العناصر التي تملكها صراحةً وأبطل الجلسة من الخادم. كما ينبغي أن يوضح الاختبار ما يحدث عند استعادة نسخة احتياطية أو نقل المستخدم إلى جهاز جديد.

صمّم دورة حياة الرمز من تسجيل الدخول إلى الإبطال

التخزين الآمن ليس سوى جزء من دورة حياة الاعتماد. يبدأ التصميم عند تسجيل الدخول: يصدر الخادم رمزًا محدود الصلاحية، ويحدد صلاحياته، ويقرر آلية تجديده وإبطاله. ينبغي ألا يحصل التطبيق على صلاحيات أوسع مما يحتاجه، وألا يكون access token طويل العمر لمجرد تسهيل البرمجة. يمكن أن يكون access token قصير العمر بينما يحتفظ التطبيق بـ refresh token في التخزين الآمن لتجديد الجلسة وفق سياسة الخادم.

عند التجديد، أرسل الطلب عبر TLS وتحقق من الاستجابة، ثم استبدل القيمة القديمة بالجديدة بطريقة لا تترك التطبيق في حالة ملتبسة. إذا كان الخادم يدعم تدوير refresh tokens، فعليه إبطال الرمز السابق عند استخدام الجديد ورصد إعادة استخدام رمز قديم وفق تصميم الجلسات. أما التطبيق، فعليه حفظ القيمة الجديدة قبل متابعة العمليات التي تعتمد عليها، والتعامل مع انقطاع الشبكة دون طباعة الرموز في السجل.

تسجيل الخروج يجب أن يشمل الخادم والجهاز

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

يجب أيضًا تحديد سلوك انتهاء الصلاحية. إذا أعاد الخادم 401، فلا تكرر الطلب بلا حدود ولا تحاول تجديد الجلسة في حلقة. نفّذ محاولة تجديد واحدة وفق سياسة معروفة، ثم أعد الطلب الأصلي مرة واحدة فقط إذا كان آمنًا لإعادة التنفيذ. إذا فشل التجديد، امسح الاعتمادات واطلب تسجيل الدخول من جديد.

تنفيذ عملي: أنشئ طبقة تخزين صغيرة وواضحة

حتى إذا اختلفت مكتبات Android وiOS أو إطار العمل مثل Flutter وReact Native، فإن واجهة التطبيق الداخلية ينبغي أن تبقى محدودة: قراءة الرمز، حفظه، حذفه، وربما التحقق من وجوده. لا تجعل كل شاشة تصل مباشرة إلى Keychain أو SharedPreferences؛ هذا يصعّب المراجعة الأمنية ويزيد احتمال نسيان حذف قيمة في مسار استثنائي.

يمكن تمثيل الواجهة بمفهوم عام كما يلي. هذا مثال شبه برمجي لتوضيح المسؤوليات، وليس مكتبة جاهزة للنسخ:

interface SecureCredentialStore {
  readRefreshToken(): Promise<string | null>;
  saveRefreshToken(token: string): Promise<void>;
  clearCredentials(): Promise<void>;
}

تستخدم طبقة المصادقة هذه الواجهة فقط. أما التنفيذ الأصلي لكل منصة فيختار Keychain أو مكتبة Android موثوقة تعتمد Keystore، مع إعدادات وصول مناسبة. لا تضف وظيفة تصدير الرموز أو طباعتها لأغراض التشخيص. وإذا احتجت إلى فحص الحالة، فسجّل حدثًا مثل “credential_missing” دون تسجيل القيمة نفسها.

التعامل مع الأخطاء بصورة آمنة

قد يفشل التخزين بسبب امتلاء المساحة، أو تغيّر حالة قفل الجهاز، أو حذف المفتاح، أو خطأ في التهيئة. عالج هذه الحالات باعتبارها نتائج متوقعة. لا تنتقل تلقائيًا إلى تخزين نصي غير محمي عند فشل التخزين الآمن؛ فهذا يحوّل عطلًا ظاهرًا إلى ثغرة صامتة. الأفضل إيقاف ميزة الاحتفاظ بتسجيل الدخول وشرح أن المستخدم قد يحتاج إلى تسجيل الدخول مجددًا.

كذلك تجنب تخزين أكثر من نسخة للرمز في الذاكرة والملفات وقاعدة البيانات. احتفظ به في أقل عدد من الأماكن، وقلّل عمره في الذاكرة قدر الإمكان. لا يمكن ضمان محو كل نسخة من ذاكرة العملية في بيئات اللغات المُدارة، لكن يمكن تجنب النسخ غير الضرورية وعدم إبقاء القيم في كائنات طويلة العمر.

اختبارات يجب أن تسبق الإطلاق

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

اختبر أيضًا استعادة النسخ الاحتياطية ونقل الحساب إلى جهاز جديد، مع مراعاة أن السلوك يختلف حسب المنصة وإعدادات الوصول. يجب أن تعرف النتيجة المتوقعة لكل حالة: هل يظل الرمز قابلًا للقراءة؟ هل يتطلب الأمر مصادقة؟ هل يجب على المستخدم تسجيل الدخول من جديد؟ وثّق القرار بدل تركه لسلوك غير مقصود في مكتبة التخزين.

قائمة مراجعة أمنية قبل النشر

  • لا توجد رموز أو كلمات مرور في السجلات أو تقارير الأعطال أو لقطات الشاشة التشخيصية.
  • تستخدم الاتصالات TLS وتتحقق من شهادات الخادم بصورة طبيعية، دون تعطيل التحقق في الإنتاج.
  • الرموز محدودة الصلاحية والصلاحيات، ويمكن إبطال الجلسات من الخادم.
  • تُحذف بيانات الاعتماد المحلية عند تسجيل الخروج أو فشل التجديد النهائي.
  • لا توجد مفاتيح ثابتة أو رموز حقيقية داخل المستودع أو ملفات الإعدادات.
  • تُختبر حالات فشل التخزين ولا ينتج عنها انتقال صامت إلى تخزين غير آمن.
  • تراجع المكتبات المستخدمة وصلاحياتها وتحديثاتها قبل إصدار النسخة.

لا تختبر فقط المسار السعيد. الاختبار الأكثر قيمة غالبًا هو ما يحدث عندما تكون القيمة مفقودة أو تالفة أو غير قابلة للفك أو مرفوضة من الخادم. راجع أيضًا مبدأ الدفاع متعدد الطبقات لفهم كيف تكمل حماية العميل ضوابط الخادم، وراجع مراقبة أخطاء تطبيقات الموبايل لتصميم تشخيص لا يكشف البيانات الحساسة.

أخطاء شائعة وتوصيات نهائية

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

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

اختيار المكتبة وتوثيق القرار

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

وأخيرًا، افصل بين حماية البيانات على الجهاز وصحة صلاحيات الحساب. لا تجعل وجود refresh token دليلًا على أن المستخدم ما زال مخولًا لكل عملية؛ فقد تتغير صلاحياته أو تُقفل الجلسة على الخادم. اجعل الخادم صاحب القرار النهائي، واستخدم التخزين المحلي لتقليل الاحتكاك لا لتجاوز التحقق.

خطة تطبيق من أربع مراحل

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

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

مقالات ذات صلة

SHARE شارك المقال
عبدالرحمن ربيع علي
كتبه

عبدالرحمن ربيع علي

Software Engineer & AI Builder

مطور برمجيات متكامل ومصمم جرافيك مع أكثر من 4 سنوات خبرة في بناء تطبيقات الويب الحديثة باستخدام PHP و JavaScript و HTML و CSS. خلفية قوية في تصميم UI/UX واستخدام متقدم لأدوات الذكاء الاصطناعي لتعزيز كفاءة التطوير والأتمتة واتخاذ القرارات. حاصل على ماجستير تنفي...

وسوم المقال

#iOS #Mobile Development #Cybersecurity #تطوير تطبيقات الموبايل #Authentication
RELATED / READ NEXT

مقالات ذات صلة

كل المقالات
COMMENTS

التعليقات (0)

كن أول من يعلّق على هذا المقال.

أضف تعليقك

يظهر تعليقك بعد المراجعة.