आईओएस पर सुरक्षित डेटा संग्रहण का परिचय

संवेदनशील उपयोगकर्ता डेटा की सुरक्षा किसी भी आईओएस एप्लिकेशन की एक मूलभूत जिम्मेदारी है। चाहे आप प्रमाणीकरण टोकन, एन्क्रिप्शन कुंजी, या निजी क्रेडेंशियल भंडारण कर रहे हों, प्लेटफ़ॉर्म एक समर्पित हार्डवेयर समर्थित समाधान प्रदान करता है: Keychain]. विपरीत या संपत्ति सूची फ़ाइलों, चाबी का गुच्छा आराम से डेटा एन्क्रिप्ट करता है और सख्त एक्सेस कंट्रोल को लागू करता है। यह लेख चाबी के साथ सुरक्षित डेटा भंडारण को लागू करने के लिए एक व्यापक गाइड प्रदान करता है, जो मूल सुरक्षा ढांचे और उत्पादन ऐप के लिए व्यावहारिक सर्वोत्तम प्रथाओं को कवर करता है।

आईओएस कीचेन को समझना

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

  • ]Resident at rest हार्डवेयर समर्थित AES-256 का उपयोग करते हुए।
  • Access control[ डिवाइस पासकोड, टच आईडी, या फेस आईडी के माध्यम से।
  • ]]]Persistence on app reinstalled (अगर कॉन्फ़िगर किया गया है) and वैकल्पिक iCloud सिंकिंग.
  • ]Isolation ऐप्स के बीच: डिफ़ॉल्ट रूप से, एक ऐप किसी अन्य ऐप की चाबी आइटम को नहीं पढ़ सकता जब तक कि वे एक चाबी का गुच्छा एक्सेस ग्रुप साझा नहीं करते हैं।

कीचेन बड़े ब्लब्स के लिए डिज़ाइन नहीं की गई है; प्रत्येक आइटम को कुछ किलोबाइट्स के तहत रखें। बड़े डेटा के लिए, API या ] का उपयोग करने पर विचार करें।

कीचेन सर्विसेज एपीआई बनाम थर्ड पार्टी लाइब्रेरी

एप्पल मूल कीचेन सेवाएं एपीआई (C-based, ), जो शक्तिशाली लेकिन क्रिया है। आप इसे सीधे उपयोग कर सकते हैं, या एक स्विफ्ट-फ्रेंडली रैपर को अपना सकते हैं। लोकप्रिय तीसरे पक्ष के पुस्तकालयों जैसे keyAccess] या SwiftKeychainWrapper]] बॉयलरप्लेट को कम करें। हालांकि, यह समझना कि अंतर्निहित एपीआई डीबगिंग के लिए आवश्यक है और जब आपको API नीतियों पर ठीक-grained नियंत्रण की आवश्यकता होती है।

कीचेन भंडारण

कुछ भी भंडारण से पहले, आपको ]Keychain आइटम क्लास पर फैसला करना होगा। सामान्य पासवर्ड के लिए सबसे आम है । इंटरनेट पासवर्ड या प्रमाणपत्र के लिए, अन्य वर्ग हैं। प्रत्येक आइटम को विशेषताओं के एक सेट द्वारा संदर्भित किया जाता है - एक शब्दकोश (CFDictionary) जो आइटम का वर्णन करता है।

मूल प्रवाह हमेशा इस पैटर्न का अनुसरण करता है:

  1. आइटम वर्ग और विशेषताओं के साथ एक क्वेरी शब्दकोश का निर्माण करें।
  2. उपयुक्त ] फ़ंक्शन ([]]], ]]], ]]]]]]]]]]]]]]]]] ]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[FLT [[FLT: [[FLT: [[FLT: [[FLT:[FLT:[FLT:[FLT:]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
  3. लौटाने की जाँच करें (] या एक त्रुटि कोड).

लिखने से पहले, सुरक्षा मॉड्यूल आयात करें:

import Security
import Foundation // for Data and String utilities

कीचेन में डेटा भंडारण

एक सामान्य पासवर्ड लेखन

वर्तमान उपयोगकर्ता के लिए एक टोकन (जैसे, एक JWT) को बचाने के लिए:

func saveToken(_ token: String, forAccount account: String) -> Bool {
 guard let tokenData = token.data(using: .utf8) else { return false }

 let query: [String: Any] = [
 kSecClass as String: kSecClassGenericPassword,
 kSecAttrAccount as String: account,
 kSecValueData as String: tokenData,
 // Optional: restrict access to when device is unlocked
 kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
 ]

 // Delete any existing item first to avoid duplicates
 SecItemDelete(query as CFDictionary)

 let status = SecItemAdd(query as CFDictionary, nil)
 return status == errSecSuccess
}

मुख्य बिंदु:

  • ]] एक प्राथमिक कुंजी के रूप में कार्य करता है; एक अद्वितीय स्ट्रिंग चुनें (उदाहरण के लिए, उपयोगकर्ता आईडी या ]]] की तरह एक स्थिर)।
  • ] जब आइटम पढ़ा जा सकता है तब नियंत्रित होता है। सबसे अच्छी सुरक्षा के लिए ] का प्रयोग करें; यह iCloud बैकअप को रोकता है और वर्तमान डिवाइस तक पहुंच को प्रतिबंधित करता है।
  • हम ] को डुप्लिकेट आइटम जमा करने से बचने के लिए जोड़ने से पहले कहते हैं। वैकल्पिक रूप से, आप ] का उपयोग कर सकते हैं।

एक्सेस कंट्रोल (बायोमेट्री या पासकोड) जोड़ना

अत्यधिक संवेदनशील डेटा के लिए, पढ़ने से पहले टच आईडी या फेस आईडी की आवश्यकता होती है:

let accessControl = SecAccessControlCreateWithFlags(
 nil,
 kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
 .userPresence, // requires passcode, Face ID, or Touch ID
 nil
)

let query: [String: Any] = [
 kSecClass as String: kSecClassGenericPassword,
 kSecAttrAccount as String: account,
 kSecValueData as String: tokenData,
 kSecAttrAccessControl as String: accessControl as Any
]
SecItemAdd(query as CFDictionary, nil)

अब कोई ] इस मद के लिए कॉल एक बॉयोमीट्रिक या पासकोड प्रॉम्प्ट को ट्रिगर करेगा। उपयोगकर्ता के संपर्क को सुंदर ढंग से संभालने के लिए स्थानीयAuthentication से ] का उपयोग करें।

कीचेन से डेटा पुनर्प्राप्त करना

संग्रहीत टोकन पढ़ने के लिए:

func retrieveToken(forAccount account: String) -> String? {
 let query: [String: Any] = [
 kSecClass as String: kSecClassGenericPassword,
 kSecAttrAccount as String: account,
 kSecReturnData as String: true,
 kSecMatchLimit as String: kSecMatchLimitOne
 ]

 var item: CFTypeRef?
 let status = SecItemCopyMatching(query as CFDictionary, &item)

 guard status == errSecSuccess,
 let data = item as? Data,
 let token = String(data: data, encoding: .utf8) else {
 return nil
 }
 return token
}

] को ]] से सेट करें डेटा वापस पाने के लिए का प्रयोग करें, ताकि एक ही परिणाम को पुनः प्राप्त किया जा सके। यदि आप सीमा को छोड़ते हैं, तो एपीआई एक सारणी वापस कर सकता है।

]Important:] जब एक्सेस कंट्रोल (बायोमेट्री) का उपयोग किया जाता है, तो कॉल वापस आ सकता है ] अगर उपयोगकर्ता रद्द कर देता है। इस मामले को अलग से संभालें और कभी सादे पाठ भंडारण पर वापस नहीं गिरें।

अद्यतन और हटाने कीचेन आइटम

मौजूदा मद को अद्यतन करना

हटाने और फिर से बोली जाने के बजाय, का उपयोग करें:

func updateToken(_ newToken: String, forAccount account: String) -> Bool {
 guard let newData = newToken.data(using: .utf8) else { return false }

 let query: [String: Any] = [
 kSecClass as String: kSecClassGenericPassword,
 kSecAttrAccount as String: account
 ]

 let attributesToUpdate: [String: Any] = [
 kSecValueData as String: newData
 ]

 let status = SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)
 return status == errSecSuccess
}

यह एक नष्ट + एडी से अधिक कुशल है, और यह संभावित दौड़ की स्थिति से बचा है।

एक आइटम को हटाने

func deleteItem(forAccount account: String) -> Bool {
 let query: [String: Any] = [
 kSecClass as String: kSecClassGenericPassword,
 kSecAttrAccount as String: account
 ]
 let status = SecItemDelete(query as CFDictionary)
 return status == errSecSuccess
}

उन वस्तुओं को हटाने के लिए सावधान रहें जो अन्य ऐप से संबंधित हैं, एक ही एक्सेस ग्रुप साझा करते हैं- वैसे ही आप साझा कीचेन का उपयोग करते हैं, तो अपने क्वेरी को ] के साथ दायर करते हैं।

अभिगम नियंत्रण और अभिगम्यता विशेषताएँ

]]] स्थिर परिभाषित करता है when keychain आइटम पढ़ा जा सकता है। सबसे प्रतिबंधित विकल्प चुनें जो अभी भी आपके ऐप की जरूरतों को पूरा करता है:

AttributeMeaning
kSecAttrAccessibleWhenUnlockedAvailable only while device is unlocked (default).
kSecAttrAccessibleAfterFirstUnlockAvailable after device boots and is unlocked once. Allows background access.
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnlyRequires a passcode to be set. Strictest option—prevents access even after unlock if passcode is removed.
kSecAttrAccessibleWhenUnlockedThisDeviceOnlySame as WhenUnlocked but does not back up to iCloud, and cannot be restored to another device.

अधिकांश ऐप्स के लिए, सुरक्षा और प्रयोज्यता के बीच सही संतुलन पर हमला करता है। यदि आपको पृष्ठभूमि में आइटम पढ़ने की आवश्यकता है (उदाहरण के लिए, पृष्ठभूमि ताज़ा टोकन) तो आपको का उपयोग करना होगा (और स्वीकार करें कि डेटा थोड़ा कम संरक्षित है)।

त्रुटि हैंडलिंग और आम नुकसान

]] कार्य एक वापस लौटते हैं। हमेशा इसे जांचें और उचित रूप से असफलताओं को संभालें। आम त्रुटियाँ:

  • ] (-25300) - कोई आइटम क्वेरी से मेल नहीं खाता है।
  • ] (-25299) - पहले से ही मौजूद समान प्राथमिक कुंजी के साथ एक आइटम (यदि आप पहले नहीं हटाते हैं)।
  • ] (128) - उपयोगकर्ता ने बॉयोमीट्रिक प्रॉम्प्ट को रद्द कर दिया।
  • ] (-25293) - प्रमाणीकरण विफल रहा है या बॉयोमीट्रिक उपलब्ध नहीं है।

कभी भी एक गैर-अनुच्छेदन स्थिति को अनदेखा नहीं किया गया। ग्रेसफुल डिग्रेड: एक त्रुटि संदेश दिखाएं या फिर पुनः प्रयास करें, लेकिन कभी भी किसी गिरावट के रूप में चाबी का गुच्छा के बाहर संवेदनशील डेटा को स्टोर नहीं किया जा सकता। आप एक्सेस करने का प्रयास करने से पहले बॉयोमीट्रिक उपलब्धता की जांच के लिए का उपयोग कर सकते हैं।

सर्वश्रेष्ठ अभ्यास और उत्पादन विचार

  • ]]Use अद्वितीय, वर्णनात्मक खाता नाम प्रति उपयोगकर्ता या प्रति आइटम प्रकार टकराव से बचने के लिए।
  • ]Always एक पहुँच योग्यता विशेषता निर्दिष्ट करें ; अन्यथा, सिस्टम डिफ़ॉल्ट (]) लागू होता है, जो आदर्श नहीं हो सकता है।
  • ]]Creprene keychain डेटा जब उपयोगकर्ता लॉग आउट - सभी ज्ञात खातों पर ध्यान दें और आइटम हटा दें।
  • ]Use Keychain Access Group केवल जब अपने स्वयं के ऐप्स के बीच साझा करने के लिए। व्यापक समूहों से बचें।
  • ]]नवर स्टोर गैर-संवेदनशील डेटा (जैसे उपयोगकर्ता वरीयताओं) keychain-use ] या इसके बजाय एक डेटाबेस में।
  • Consider ]] का उपयोग करके ] उन्नत परिदृश्यों के लिए (मैकस कैटलिस्ट)]] [FLT:>]]]]] ]] ]]]] ]]]] ]]]]]]]]] [[FLT:>]]]]]]]] का उपयोग कर कन्साइडर [[FLT:]]]]]]]]]]]]] उन्नत परिदृश्यों के लिए (मैकसमाकस CataOS Catalyst (MacOS Catalyst]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[FLT: [[FLT: [[F
  • ]एक वास्तविक उपकरण पर टेस्ट ; सिम्युलेटर एक सॉफ्टवेयर कीचेन का उपयोग करता है जो हार्डवेयर समर्थित स्टोरेज से अलग-अलग व्यवहार करता है।

SwiftUI और Async/Await के साथ चाबी का प्रयोग

आधुनिक ऐप्स के लिए, मुख्य धागे को अवरुद्ध करने से बचने के लिए एक अभिनेता या एक एसिंक-सुरक्षित वर्ग में चाबी का गुच्छा संचालन। उदाहरण के लिए का उपयोग करना:

actor KeychainManager {
 func saveToken(_ token: String, for account: String) async -> Bool {
 // same implementation as above, but now it's safe to call from any context
 return saveToken(token, forAccount: account)
 }
}

यदि आप बॉयोमीट्रिक्स का उपयोग करते हैं, तो कॉल उपयोगकर्ता के संपर्क का इंतजार करते समय धागे को अवरुद्ध कर सकता है। इसे पृष्ठभूमि कतार में लपेटो, या बेहतर, ] का उपयोग keychain कॉल से पहले विधि।

निष्कर्ष

The iOS Keychain is the correct place to store small, sensitive pieces of data. By using the native Keychain Services API, you gain direct control over encryption, accessibility, and authentication policies. Always pair your Keychain usage with solid error handling and remember to clear data when appropriate. For further reading, refer to the Apple Keychain Service Documentation and the Keychain Concepts overview. Adopting these practices will help you ship iOS apps that respect user privacy and withstand security scrutiny.