IOS ऐप में सुरक्षा

शुभ दोपहर, हब्र! मैं आपको अरलिंद अलीू द्वारा "आईओएस एप्लिकेशन में हर एप्लिकेशन के लिए एप्लिकेशन सिक्योरिटी मस्ट" iOS अनुप्रयोगों में गोपनीय डेटा की सुरक्षा के बुनियादी सिद्धांतों के बारे में एक लेख का अनुवाद पेश करता हूं।

अनुप्रयोग सुरक्षा सॉफ़्टवेयर विकास के सबसे महत्वपूर्ण पहलुओं में से एक है। एप्लिकेशन उपयोगकर्ताओं को उम्मीद है कि वे जो जानकारी प्रदान करते हैं वह सुरक्षित रूप से सुरक्षित है। इसलिए, आप किसी को केवल गोपनीय जानकारी नहीं दे सकते।

सौभाग्य से, इस लेख में हम उन गलतियों पर चर्चा करेंगे जो डेवलपर्स अपने अनुप्रयोगों में करते हैं, साथ ही साथ उन्हें हल करने के तरीके भी।
कट के नीचे जारी है।

गलत जगह डेटा स्टोरेज


मैंने AppStore से कई अनुप्रयोगों का एक अध्ययन किया और कई एक ही गलती करते हैं: गोपनीय जानकारी संग्रहीत की जाती है जहां यह नहीं होना चाहिए।
यदि आप UserDefaults में व्यक्तिगत डेटा संग्रहीत करते हैं, तो आप इसे जोखिम में डालते हैं। UserDefaults गुणों की सूची वाली फ़ाइल में संग्रहीत हैं, जो आपके एप्लिकेशन में "सेटिंग" फ़ोल्डर के अंदर स्थित है। डेटा को एन्क्रिप्शन के मामूली संकेत के बिना एप्लिकेशन में संग्रहीत किया जाता है।

मैकिंग पर थर्ड-पार्टी प्रोग्राम इंस्टॉल करके, जैसे कि आईमेकिंग, आपको फोन को हैक करना भी नहीं आता है, लेकिन तुरंत ऐपस्टोर से इंस्टॉल किए गए एप्लिकेशन से सभी यूजरडिफॉल्ट डेटा देखें। ऐसे प्रोग्राम आपको iPhone पर इंस्टॉल किए गए एप्लिकेशन से डेटा देखने और प्रबंधित करने की अनुमति देते हैं। आप आसानी से किसी भी आवेदन के UserDefaults प्राप्त कर सकते हैं।
यह मुख्य कारण है कि मैंने एक लेख लिखने का फैसला क्यों किया - मुझे ऐपस्टोर में अनुप्रयोगों का एक समूह मिला जो उपयोगकर्ता डेटाफ़ॉल्ट्स में डेटा संग्रहीत करता है, जैसे: टोकन, सक्रिय और नवीकरणीय सदस्यता, उपलब्ध धनराशि, और इसी तरह। यह सब डेटा आसानी से प्राप्त किया जा सकता है और दुर्भावनापूर्ण इरादे से उपयोग किया जा सकता है, नेटवर्क में स्तर पर हैकिंग और खराब होने के लिए आवेदन में भुगतान सदस्यता को प्रबंधित करने से।

और अब डेटा को स्टोर करने के तरीके के बारे में।

याद रखें, उपयोगकर्ता की थोड़ी-सी जानकारी को ही यूजरडिफॉल्ट्स में संग्रहित किया जाना चाहिए, जैसे कि एप्लिकेशन के भीतर सेटिंग्स, यानी डेटा, जो उपयोगकर्ता के लिए गोपनीय नहीं है।

व्यक्तिगत जानकारी संग्रहीत करने के लिए Apple की समर्पित सुरक्षा सेवाओं का उपयोग करें। किचेन एपीआई सेवा आपको एक निश्चित मात्रा में उपयोगकर्ता डेटा को एक एन्क्रिप्टेड डेटाबेस में संग्रहीत करने की अनुमति देती है। वहां आप उपयोगकर्ता के लिए पासवर्ड और अन्य महत्वपूर्ण डेटा स्टोर कर सकते हैं, जैसे क्रेडिट कार्ड की जानकारी, या यहां तक ​​कि छोटे महत्वपूर्ण नोट।
इसके अलावा, वहाँ एन्क्रिप्टेड कुंजी और प्रमाण पत्र हो सकते हैं जिसके साथ आप काम करते हैं।

किचेन एपीआई सेवा


निम्नलिखित एक उदाहरण है कि किचेन में उपयोगकर्ता के पासवर्ड को कैसे बचाया जाए।

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 का अर्थ है कि जिस जानकारी को एन्क्रिप्ट किया जाना है, वह पासवर्ड है। फिर हम 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) } 

पहली नज़र में, यह लग सकता है कि किचेन एपीआई का उपयोग करना काफी मुश्किल है, खासकर यदि आपको एक से अधिक पासवर्ड सहेजने की आवश्यकता है, तो मैं आपसे इन उद्देश्यों के लिए मुखौटा पैटर्न का उपयोग करने का आग्रह करता हूं। यह आपको एप्लिकेशन की जरूरतों के आधार पर डेटा को बचाने और संशोधित करने की अनुमति देगा।

यदि आप इस पैटर्न के बारे में अधिक जानना चाहते हैं, साथ ही साथ जटिल सबसिस्टम के लिए एक सरल आवरण कैसे बनाएं, तो यह लेख आपकी मदद करेगा। इसके अलावा इंटरनेट पर खुले पुस्तकालयों की भरमार है जो किचेन एपीआई का उपयोग करने में मदद करते हैं, उदाहरण के लिए, SAMKeychain और SwiftKeychainWrapper

पासवर्ड सेविंग और ऑथराइजेशन


अपने विकास करियर में, मैं लगातार एक ही समस्या का सामना करता हूं। डेवलपर्स या तो एप्लिकेशन में पासवर्ड स्टोर करते हैं, या सर्वर के लिए एक अनुरोध बनाते हैं, जो सीधे उपयोगकर्ता नाम और पासवर्ड भेजता है।

यदि आप UserDefault में डेटा स्टोर करते हैं, तो लेख के पहले भाग से जानकारी पढ़ने के बाद, आप पहले ही समझ जाते हैं कि आप कितना जोखिम रखते हैं। किचेन में पासवर्ड स्टोर करके, आप गंभीरता से अपने एप्लिकेशन के सुरक्षा स्तर को बढ़ाते हैं, लेकिन फिर, इससे पहले कि आप संवेदनशील जानकारी को कहीं भी सहेज लें, आपको पहले इसे एन्क्रिप्ट करना होगा।

मान लीजिए कि कोई हैकर हमारे नेटवर्क के जरिए हम पर हमला कर सकता है। इस प्रकार, वह कच्चे पाठ के रूप में पासवर्ड प्राप्त करेगा। बेशक, सभी पासवर्ड को हैश करना बेहतर है।

व्यक्तिगत डेटा एन्क्रिप्शन


यदि आप इसे स्वयं करते हैं, तो हैशिंग थोड़ा अटपटा लग सकता है, इसलिए इस लेख में हम CryptoSwift लाइब्रेरी का उपयोग करेंगे। इसने स्विफ्ट में उपयोग किए जाने वाले कई मानक विश्वसनीय एन्क्रिप्शन एल्गोरिदम एकत्र किए हैं।

आइए 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) } 

उपरोक्त फ़ंक्शन उपयोगकर्ता नाम और पासवर्ड रिकॉर्ड करता है और उन्हें एक एन्क्रिप्टेड स्ट्रिंग के रूप में किचेन में बचाता है।

आइए देखें कि अंदर क्या होता है:

- लॉगिन और पासवर्ड को एक स्ट्रिंग के रूप में नमक चर में लिखा जाता है
- sha256 SHA-2 हैश भरता है
- संदेश प्रमाणीकरण कोड ( HMAC ) के आधार पर LOF एक प्रमुख पीढ़ी का कार्य ( KDF ) है

हमने हैकर्स के लिए कार्य को जटिल करने के लिए नमक चर बनाया। हम केवल पासवर्ड एन्क्रिप्ट कर सकते हैं, लेकिन इस मामले में हमलावर के पास सबसे अधिक बार उपयोग किए जाने वाले पासवर्डों की एक सूची हो सकती है, वह उन्हें समस्याओं के बिना एन्क्रिप्ट करेगा और हमारे एन्क्रिप्टेड पासवर्ड के साथ उनकी तुलना करेगा। फिर एक विशिष्ट खाते के लिए पासवर्ड ढूंढना मुश्किल नहीं है।
अब हम अपने खाते और उत्पन्न कुंजी का उपयोग कर लॉग इन कर सकते हैं।

 authManager.login(key, user) 

बेशक, सर्वर को पता होना चाहिए कि हमारे नमक चर में क्या एन्क्रिप्ट किया गया है। बैकएंड उपयोगकर्ता की पहचान करने के लिए एक ही एल्गोरिदम का उपयोग करके कुंजियों की तुलना करने में सक्षम होगा।
इस दृष्टिकोण का उपयोग करना आपके आवेदन की सुरक्षा को बहुत बढ़ाएगा।

जैसे पूरा हो गया


अपने आवेदन की सुरक्षा की उपेक्षा कभी न करें। इस लेख में, हमने सबसे पहले यह पता लगाया कि UserDefaults में संवेदनशील डेटा संग्रहीत करने के कारण क्या परिणाम हो सकते हैं और किचेन की आवश्यकता क्यों है।

दूसरे भाग में, हम सुरक्षा के एक और अधिक गंभीर स्तर के बारे में बात करेंगे, इसे सहेजने से पहले डेटा को एन्क्रिप्ट करना, और यह भी चर्चा करें कि व्यक्तिगत डेटा के साथ जानकारी को सर्वर पर सही तरीके से कैसे स्थानांतरित किया जाए।

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


All Articles