الأمان في تطبيقات iOS

مساء الخير يا هبر! أقدم لكم ترجمة مقال حول المبادئ الأساسية لأمن البيانات السرية في تطبيقات iOS "متطلبات أمان التطبيق لكل تطبيق iOS" بقلم Arlind Aliu.

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

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

تخزين البيانات في المكان الخاطئ


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

من خلال تثبيت برنامج تابع لجهة خارجية على نظام التشغيل Mac ، مثل iMazing ، لن تضطر إلى اختراق الهاتف ، ولكن ترى على الفور جميع بيانات UserDefaults من التطبيق المثبت من AppStore. تسمح لك هذه البرامج بمشاهدة وإدارة البيانات من التطبيقات المثبتة على iPhone. يمكنك بسهولة الحصول على UserDefaults من أي تطبيق.
هذا هو السبب الرئيسي وراء قراري كتابة مقال - لقد وجدت مجموعة من التطبيقات في AppStore التي تخزن البيانات في UserDefaults ، مثل الرموز المميزة والاشتراكات النشطة والمتجددة ومقدار الأموال المتاحة وما إلى ذلك. يمكن الحصول على جميع هذه البيانات واستخدامها بسهولة بنية خبيثة ، من إدارة الاشتراكات المدفوعة في التطبيق إلى القرصنة على مستوى الشبكة وما هو أسوأ.

والآن حول كيفية تخزين البيانات.

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

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

خدمة API Keychain


فيما يلي مثال على كيفية حفظ كلمة مرور المستخدم في Keychain.

class KeychainService { func save(_ password: String, for account: String) { let password = password.data(using: String.Encoding.utf8)! let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: account, kSecValueData as String: password] let status = SecItemAdd(query as CFDictionary, nil) guard status == errSecSuccess else { return print("save error") } } 

جزء من قاموس kSecClass: kSecClassGenericPassword يعني أن المعلومات التي يجب تشفيرها هي كلمة المرور. ثم نضيف كلمة المرور الجديدة إلى keychain عن طريق استدعاء طريقة SecItemAdd . استرجاع البيانات من حزمة يشبه الحفظ.

 func retrivePassword(for account: String) -> String? { let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: account, kSecMatchLimit as String: kSecMatchLimitOne, kSecReturnData as String: kCFBooleanTrue] var retrivedData: AnyObject? = nil let _ = SecItemCopyMatching(query as CFDictionary, &retrivedData) guard let data = retrivedData as? Data else {return nil} return String(data: data, encoding: String.Encoding.utf8) } 

دعنا نكتب شيكًا صغيرًا حول صحة حفظ البيانات واستلامها.

 func testPaswordRetrive() { let password = "123456" let account = "User" keyChainService.save(password, for: account) XCTAssertEqual(keyChainService.retrivePassword(for: account), password) } 

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

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

حفظ كلمة المرور والتفويض


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

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

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

تشفير البيانات الشخصية


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

دعونا نحاول حفظ واستعادة كلمة المرور من سلسلة المفاتيح باستخدام خوارزميات CryptoSwift .

 func saveEncryptedPassword(_ password: String, for account: String) { let salt = Array("salty".utf8) let key = try! HKDF(password: Array(password.utf8), salt: salt, variant: .sha256).calculate().toHexString() keychainService.save(key, for: account) } 

تقوم الوظيفة أعلاه بتسجيل اسم المستخدم وكلمة المرور وحفظها في Keychain كسلسلة مشفرة.

دعونا نرى ما يحدث في الداخل:

- تتم كتابة تسجيل الدخول وكلمة المرور إلى متغير الملح كسلسلة
- sha256 يملأ تجزئة SHA-2
- HKDF هي وظيفة إنشاء مفتاح ( KDF ) بناءً على رمز توثيق الرسالة ( HMAC )

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

 authManager.login(key, user) 

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

عند الانتهاء


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

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

Source: https://habr.com/ru/post/ar430532/


All Articles