Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Security
Code

تخزين البيانات بأمان على Android

by
Difficulty:AdvancedLength:LongLanguages:

Arabic (العربية/عربي) translation by Adjatay Bashroh Aldad (you can also view the original English article)

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

أساسيات

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

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

من الجيد التمسك بهذا الإعداد الافتراضي. يمكنك تعيينه بشكل صريح عند حفظ تفضيل مشترك.

أو عند حفظ ملف.

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

يمكنك أيضًا منع التطبيق وبياناته من النسخ الاحتياطي. هذا يمنع أيضًا تنزيل محتويات دليل البيانات الخاص بالتطبيق باستخدام النسخ الاحتياطي من adb. للقيام بذلك ، قم بتعيين سمة android: allowBackup إلى false في ملف البيان. بشكل افتراضي ، يتم تعيين هذه السمة إلى true.

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

تأمين بيانات المستخدم بكلمة مرور

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

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

AES واشتقاق مفتاح كلمة المرور

سنستخدم معيار AES الموصى به ، والذي يشفر البيانات المقدمة مفتاح. يتم استخدام نفس المفتاح المستخدم لتشفير البيانات لفك تشفير البيانات ، والتي تسمى التشفير المتناظر. هناك أحجام مفاتيح مختلفة ، و AES256 (256 بت) هو الطول المفضل للاستخدام مع البيانات الحساسة.

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

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

تضمن فئة SecureRandom أن يكون الناتج الذي تم إنشاؤه صعباً للتنبؤ به - إنه 'مولد أرقام عشوائي قوي قوي التشفير'. يمكننا الآن وضع الملح وكلمة المرور في كائن التشفير المستندة إلى كلمة المرور: PBEKeySpec. يأخذ منشئ الكائن أيضًا نموذج حساب التكرار مما يجعل المفتاح أقوى. ويرجع ذلك إلى أن زيادة عدد التكرارات يوسع الوقت الذي سيستغرقه التشغيل على مجموعة من المفاتيح أثناء هجوم القوة الغاشمة. ثم يتم تمرير PBEKeySpec إلى SecretKeyFactory ، والذي يولد في النهاية المفتاح كصفيف بايت []. سنقوم بلف ذلك الصفيف البايت الخام [] في كائن SecretKeySpec.

لاحظ أنه يتم تمرير كلمة المرور كصفيف char [] ويقوم فئة PBEKeySpec بتخزينها كصفيف char [] أيضاً. يتم استخدام صفائف char [] عادةً لوظائف التشفير لأنه في حين أن فئة String غير قابلة للتغيير ، يمكن استبدال مصفوفة char [] تحتوي على معلومات حساسة - وبالتالي إزالة البيانات الحساسة بالكامل من ذاكرة الوصول العشوائي phyc في الجهاز.

ناقلات التهيئة

نحن الآن على استعداد لتشفير البيانات ، ولكن لدينا شيء آخر للقيام به. هناك طرق مختلفة للتشفير باستخدام AES ، لكننا سنستخدم الأسلوب الموصى به: تسلسل كتلة التشفير (CBC). هذا يعمل على بياناتنا كتلة واحدة في وقت واحد. الأمر الرائع في هذا الوضع هو أن كل كتلة غير مشفرة من البيانات هي XOR’d مع الفدرة المشفرة السابقة لجعل التشفير أقوى. ومع ذلك ، فإن هذا يعني أن الكتلة الأولى لن تكون فريدة من نوعها مثل غيرها.

إذا كانت الرسالة التي سيتم تشفيرها ستبدأ بنفس رسالة أخرى ليتم تشفيرها ، فإن المخرجات المشفرة في البداية ستكون هي نفسها ، وهذا من شأنه أن يعطي للمهاجمين فكرة لمعرفة ما قد تكون عليه الرسالة. الحل هو استخدام ناقل التهيئة (IV).

يمثل IV مجرد كتلة من وحدات البايت العشوائية التي ستكون XOR’d مع الكتلة الأولى لبيانات المستخدم. ونظرًا لأن كل كتلة تعتمد على كل الكتل التي تمت معالجتها حتى هذه النقطة ، فسيتم تشفير الرسالة بالكامل بشكل فريد - ولن تؤدي الرسائل المتطابقة المشفرة بنفس المفتاح إلى نتائج متطابقة. يتيح إنشاء IV الآن.

ملاحظة حول SecureRandom. في الإصدارات 4.3 وما دون ، وجد أن Java Cryptography Architecture تعاني من ضعف بسبب التهيئة غير الصحيحة لمولد الأعداد العشوائية الكاذبة (PRNG). إذا كنت تستهدف الإصدارات 4.3 وما دون ، يتوفر إصلاح.

تشفير البيانات

مسلحين مع IvParameterSpec ، يمكننا الآن القيام بالتشفير الفعلي.

هنا نمر في السلسلة ''AES / CBC / PKCS7Padding''. هذا يحدد AES التشفير مع تسلسل كتلة سايفر. يشير الجزء الأخير من هذه السلسلة إلى PKCS7 ، وهو معيار ثابت لبيانات المساحة التي لا تتناسب تمامًا مع حجم الكتلة. (كتل 128 بت ، ويتم الحشو قبل التشفير.)

لإكمال مثالنا ، سنضع هذا الكود بطريقة تشفير ستقوم بدمج النتيجة في HashMap الذي يحتوي على البيانات المشفرة ، بالإضافة إلى متجه الملح والتهيئة الضرورية لفك التشفير.

طريقة فك التشفير

ما عليك سوى تخزين IV والملح مع بياناتك. في حين تعتبر الأملاح و IVs عامة ، تأكد من أنها لا تتم زيادتها أو إعادة استخدامها بالتسلسل. لفك تشفير البيانات ، كل ما نحتاج إليه هو تغيير الوضع في مُنشئ التشفير من ENCRYPT_MODE إلى DECRYPT_MODE. ستأخذ طريقة فك تشفير HashMap التي تحتوي على نفس المعلومات المطلوبة (البيانات المشفرة والملح والرابع) وترجع صفيف بايت [] تم فك تشفيره ، مع إعطاء كلمة المرور الصحيحة. سيقوم أسلوب فك التشفير بإعادة إنشاء مفتاح التشفير من كلمة المرور. يجب عدم تخزين المفتاح!

اختبار التشفير وفك التشفير

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

تستخدم الطرق صفيف بايت [] بحيث يمكنك تشفير البيانات العشوائية بدلاً من كائنات السلسلة فقط.

حفظ البيانات المشفرة

الآن لدينا مجموعة بايت مشفرة [] ، يمكننا حفظه في التخزين.

إذا كنت لا تريد حفظ IV والملح بشكل منفصل ، فإن HashMap قابل للتسلسل مع فئتي ObjectInputStream و ObjectOutputStream.

حفظ البيانات الآمنة على SharedPreferences

يمكنك أيضًا حفظ البيانات الآمنة في SharedPreferences الخاص بالتطبيق.

نظرًا لأن SharedPreferences هو نظام XML يقبل فقط قيمًا أولية وكائنات محددة ، فإننا نحتاج إلى تحويل بياناتنا إلى تنسيق متوافق مثل كائن String. يتيح Base64 لنا تحويل البيانات الأولية إلى تمثيل سلسلة يحتوي فقط على الأحرف المسموح بها بتنسيق XML. تشفير المفتاح والقيمة بحيث لا يتمكن المهاجم من معرفة القيمة التي قد تكون لها قيمة. في المثال أعلاه ، تكون encryptedKey و encryptedValue عبارة عن كلتا البايت المشفرة [] المصفوفة التي تم إرجاعها من طريقة encryptBytes () الخاصة بنا. يمكن حفظ IV والملح في ملف التفضيلات أو كملف منفصل. لاستعادة البايت المشفر من SharedPreferences ، يمكننا تطبيق فك Base64 على السلسلة المخزنة.

مسح البيانات غير الآمنة من الإصدارات القديمة

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

نظريًا ، يمكنك فقط حذف تفضيلاتك المشتركة عن طريق إزالة /data/data/com.your.package.name/shared_prefs/your_prefs_name.xml وملفات your_prefs_name.bak ومسح تفضيلات الذاكرة مع التعليمة البرمجية التالية:

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

استنتاج

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

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

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.