Keychain iOS, watchOS, macOS और tvOS में एक सुरक्षित क्रेडेंशियल भंडारण है जो पासवर्ड, कुंजियों और प्रमाणपत्रों को हार्डवेयर स्तर पर प्रबंधित करता है। UserDefaults के विपरीत, Keychain में डेटा एन्क्रिप्ट किया जाता है और एप्लिकेशन सैंडबॉक्स द्वारा अलग किया जाता है। Apple Developer Documentation के अनुसार, Keychain गोपनीय जानकारी की सुरक्षा के लिए Secure Enclave तंत्र और AES-256 हार्डवेयर एन्क्रिप्शन का उपयोग करता है।
मुख्य बिंदु
Keychain Apple ऑपरेटिंग सिस्टम का एक सुरक्षित डेटाबेस है जो पासवर्ड, क्रिप्टोग्राफ़िक कुंजियों, प्रमाणपत्रों और अन्य संवेदनशील डेटा के सुरक्षित भंडारण के लिए डिज़ाइन किया गया है। Keychain पहली बार Mac OS 8.6 में 1999 में दिखाई दिया, और iOS पर — पहले SDK संस्करण से।
Keychain मोबाइल डेवलपमेंट की एक मूलभूत समस्या को हल करता है: असुरक्षित फ़ाइल सिस्टम में रहस्यों (टोकन, पासवर्ड, एन्क्रिप्शन कुंजियाँ) का भंडारण। UserDefaults या SQLite के विपरीत, Keychain में डेटा एन्क्रिप्टेड रूप में संग्रहीत होता है और डिस्क पर लिखते समय स्वचालित रूप से एन्क्रिप्ट होता है।
प्रत्येक iOS एप्लिकेशन एक पृथक सैंडबॉक्स में काम करता है और केवल अपने keychain तक पहुँच रखता है। हालांकि, डेवलपर keychain access groups के माध्यम से एक ही डेवलपर के एप्लिकेशन के बीच साझा Keychain पहुँच कॉन्फ़िगर कर सकता है। उपयोगकर्ता का iCloud Keychain एंड-टू-एंड एन्क्रिप्शन के माध्यम से उपकरणों के बीच डेटा सिंक्रोनाइज़ करता है।
Apple Security White Paper (2025) के अनुसार, Keychain डिवाइस के अद्वितीय पहचानकर्ता (UID) से बंधी कुंजी के साथ AES-256 हार्डवेयर एन्क्रिप्शन का उपयोग करता है, जिससे डिवाइस से निकालने पर डेटा दुर्गम हो जाता है।
Keychain एक स्तरित सेवा के रूप में कार्य करता है: एप्लिकेशन Security framework तक पहुँचता है, जो एन्क्रिप्टेड SQLite Keychain डेटाबेस का प्रबंधन करने वाले securityd डेमन के साथ संचार करता है। प्रत्येक रिकॉर्ड एक अलग कुंजी से एन्क्रिप्ट किया जाता है, और कुंजियाँ स्वयं A7 चिप और नए उपकरणों पर Secure Enclave हार्डवेयर मॉड्यूल द्वारा सुरक्षित होती हैं।
Security framework Keychain Services के साथ काम करने के लिए C इंटरफ़ेस प्रदान करता है। मुख्य फ़ंक्शन: SecItemAdd (जोड़ना), SecItemCopyMatching (खोज), SecItemUpdate (अपडेट) और SecItemDelete (हटाना)। प्रत्येक ऑपरेशन अनुरोध प्रकार का वर्णन करने वाला CFDictionaryRef गुण शब्दकोश स्वीकार करता है।
डेटा को वर्गों में वर्गीकृत किया जाता है: kSecClassGenericPassword (मनमाना पासवर्ड), kSecClassInternetPassword (इंटरनेट सेवा पासवर्ड), kSecClassCertificate (प्रमाणपत्र), kSecClassKey (क्रिप्टोग्राफ़िक कुंजी) और kSecClassIdentity (कुंजी और प्रमाणपत्र युग्म)।
पासवर्ड सहेजते समय, एप्लिकेशन गुणों के साथ एक शब्दकोश बनाता है: सेवा, खाता, पहुँच स्तर, लेबल। Security framework डेटा को securityd डेमन को भेजता है, जो डिवाइस से बंधी कुंजी से रिकॉर्ड को एन्क्रिप्ट करता है और Keychain SQLite में संग्रहीत करता है। पुनर्प्राप्ति इसी प्रकार होती है: गुणों द्वारा क्वेरी, खोज, डिक्रिप्शन और डेटा वापसी।
एक महत्वपूर्ण विशेषता: जब कोई एप्लिकेशन हटाया जाता है, iOS स्वचालित रूप से उस एप्लिकेशन द्वारा बनाए गए Keychain रिकॉर्ड को साफ़ करता है (iOS 10.3+ से)। एप्लिकेशन को पुनः स्थापित करने पर, पिछली स्थापना का Keychain डेटा उपलब्ध नहीं होता जब तक कि iCloud Keychain का उपयोग न किया गया हो।
import Security
func savePassword(service: String, account: String, password: Data) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account,
kSecValueData as String: password,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
]
SecItemAdd(query as CFDictionary, nil)
}
Keychain पाँच मुख्य डेटा वर्गों का समर्थन करता है, प्रत्येक का अपना गुणों का सेट और अनुप्रयोग क्षेत्र होता है। वर्ग का चुनाव यह निर्धारित करता है कि कौन सी खोज कुंजियाँ उपलब्ध हैं और डेटा कैसे एन्क्रिप्ट किया जाता है।
kSecClassGenericPassword और kSecClassInternetPassword वर्ग स्ट्रिंग पासवर्ड के भंडारण के लिए डिज़ाइन किए गए हैं। इंटरनेट संस्करण अतिरिक्त रूप से सर्वर डेटा संग्रहीत करता है: डोमेन, प्रोटोकॉल, पोर्ट और प्रमाणीकरण पथ। GenericPassword का उपयोग सर्वर से बंधन के बिना किसी भी पासवर्ड के भंडारण के लिए किया जाता है।
इंटरनेट पासवर्ड सहेजते समय, आप kSecAttrServer (डोमेन), kSecAttrProtocol (HTTPS, FTP, आदि), kSecAttrPort और kSecAttrPath निर्दिष्ट कर सकते हैं। यह AutoFill के माध्यम से स्वचालित भराव के दौरान रिकॉर्ड की सटीक पहचान की अनुमति देता है।
kSecClassKey वर्ग सममित (AES) और असममित (RSA, EC) कुंजियाँ संग्रहीत करता है। kSecClassCertificate वर्ग X.509 प्रमाणपत्र संग्रहीत करता है। kSecClassIdentity वर्ग एक निजी कुंजी और उसके संबंधित प्रमाणपत्र को एक रिकॉर्ड में जोड़ता है।
असममित कुंजियों के लिए, Keychain गुणों का समर्थन करता है: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (Keychain में सहेजना है या नहीं)। प्रमाणपत्रों के लिए: kSecAttrLabel (मानव-पठनीय नाम), kSecAttrSubject (मालिक का DN), kSecAttrIssuer (जारीकर्ता का DN)।
| Keychain वर्ग | उद्देश्य | डेटा प्रकार |
|---|---|---|
| kSecClassGenericPassword | एप्लिकेशन पासवर्ड | Data (NSString) |
| kSecClassInternetPassword | सर्वर पासवर्ड | Data + सर्वर गुण |
| kSecClassCertificate | X.509 प्रमाणपत्र | SecCertificate |
| kSecClassKey | क्रिप्टोग्राफ़िक कुंजी | SecKey |
| kSecClassIdentity | कुंजी + प्रमाणपत्र | SecIdentity |
नेटिव iOS कोड में Keychain के साथ इंटरैक्ट करने का मुख्य इंटरफ़ेस Security framework के फ़ंक्शन हैं। Swift और Objective-C के लिए, एक एकल C इंटरफ़ेस उपलब्ध है, जो सुविधाजनक फ़ंक्शनों में लपेटा गया है।
SecItemAdd फ़ंक्शन Keychain में एक नया आइटम जोड़ता है। यह वर्ग, डेटा और गुणों वाला एक शब्दकोश इनपुट के रूप में लेता है। errSecSuccess (0) स्थिति या त्रुटि कोड लौटाता है। SecItemCopyMatching फ़ंक्शन गुणों द्वारा खोज करता है और मिला डेटा लौटाता है।
खोज के लिए kSecReturnData फ़्लैग का उपयोग किया जाता है — यदि true है, तो फ़ंक्शन रिकॉर्ड की सामग्री लौटाता है। kSecMatchLimit फ़्लैग परिणामों की संख्या निर्धारित करता है: kSecMatchLimitOne (एक) या kSecMatchLimitAll (सभी)।
func readPassword(service: String, account: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
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 else { return nil }
return item as? Data
}
SecItemUpdate मौजूदा रिकॉर्ड के गुणों या डेटा को बदलने की अनुमति देता है। SecItemDelete पास किए गए शब्दकोश से मेल खाने वाले सभी रिकॉर्ड हटाता है। हटाते समय, पर्याप्त गुण निर्दिष्ट करना महत्वपूर्ण है ताकि साझा keychain में अन्य रिकॉर्ड गलती से न हटें।
func deletePassword(service: String, account: String) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: account
]
SecItemDelete(query as CFDictionary)
}
प्रत्येक Keychain रिकॉर्ड में kSecAttrAccessible गुण होता है, जो यह निर्धारित करता है कि डेटा पढ़ने के लिए कब उपलब्ध है। यह सुरक्षा के लिए अत्यंत महत्वपूर्ण है: गलत पहुँच स्तर डेटा को असुरक्षित बना सकता है या, इसके विपरीत, आवश्यकता पड़ने पर अनुपलब्ध कर सकता है।
kSecAttrAccessibleWhenUnlocked — डेटा केवल तभी उपलब्ध होता है जब डिवाइस अनलॉक हो। kSecAttrAccessibleAfterFirstUnlock — रीबूट के बाद पहले अनलॉक के बाद उपलब्ध। kSecAttrAccessibleAlways — हमेशा उपलब्ध (अनुशंसित नहीं)। ThisDeviceOnly पोस्टफ़िक्स बैकअप के माध्यम से डेटा स्थानांतरण को रोकता है।
Secure Enclave वाले उपकरणों पर, Keychain एन्क्रिप्शन कुंजी को बायोमेट्रिक्स द्वारा अतिरिक्त रूप से संरक्षित किया जा सकता है: kSecAccessControlBiometryCurrentSet या kSecAccessControlUserPresence। यह प्रत्येक पढ़ने के ऑपरेशन के लिए Face ID या Touch ID की आवश्यकता जोड़ता है।
iCloud Keychain एंड-टू-एंड एन्क्रिप्शन के माध्यम से Apple उपकरणों के बीच रिकॉर्ड सिंक्रोनाइज़ करता है। Apple के पास डिक्रिप्टेड डेटा तक पहुँच नहीं है। सिंक्रोनाइज़ेशन सक्षम करने के लिए, kSecAttrSynchronizable गुण को kCFBooleanTrue मान के साथ जोड़ें।
महत्वपूर्ण: सिंक्रोनाइज़ किए गए रिकॉर्ड में ThisDeviceOnly गुण नहीं हो सकता, क्योंकि वे अन्य उपकरणों पर उपलब्ध होने चाहिए। सभी उपकरणों के खो जाने पर, iCloud Keychain को पुनर्प्राप्ति कोड या iCloud पुनर्प्राप्ति कुंजी के माध्यम से बहाल किया जा सकता है।
प्रमाणीकरण टोकन के लिए, kSecAttrAccessibleWhenUnlockedThisDeviceOnly का उपयोग करें — डेटा केवल डिवाइस अनलॉक होने पर उपलब्ध होता है और बैकअप में कॉपी नहीं होता। उन प्रमाणपत्रों के लिए जो पृष्ठभूमि कार्यों के लिए उपलब्ध होने चाहिए, kSecAttrAccessibleAfterFirstUnlock का उपयोग करें। संवेदनशील डेटा के लिए kSecAttrAccessibleAlways का कभी उपयोग न करें।
उन डेटा के लिए हमेशा ThisDeviceOnly पोस्टफ़िक्स जोड़ने की अनुशंसा की जाती है जिन्हें सिंक्रोनाइज़ेशन की आवश्यकता नहीं है। यह iCloud या iTunes बैकअप में रहस्यों की आकस्मिक प्रतिलिपि को रोकता है, जहाँ उन्हें विश्लेषण उपकरणों द्वारा निकाला जा सकता है। महत्वपूर्ण डेटा के लिए, उपलब्धता को kSecAccessControlUserPresence के साथ जोड़ें — यह रिकॉर्ड डिक्रिप्शन के लिए बायोमेट्रिक या पासकोड आवश्यकता जोड़ता है।
iCloud Keychain का उपयोग करते समय, ध्यान रखें कि सिंक्रोनाइज़ किए गए रिकॉर्ड सभी उपयोगकर्ता उपकरणों पर उपलब्ध होते हैं: यदि कोई हमलावर एक डिवाइस तक पहुँच प्राप्त करता है, तो डेटा सभी पर समझौता हो सकता है। पृथक रहस्यों के लिए, ThisDeviceOnly का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
UserDefaults डेटा को .plist फ़ाइल में सादे पाठ में संग्रहीत करता है, जो IPA विश्लेषण के दौरान सुलभ है। Keychain प्रत्येक रिकॉर्ड को अलग-अलग एन्क्रिप्ट करता है, हार्डवेयर एन्क्रिप्शन का उपयोग करता है और पहुँच स्तर, बायोमेट्रिक्स और iCloud के माध्यम से सिंक्रोनाइज़ेशन का समर्थन करता है।
प्रत्येक iOS सिम्युलेटर लॉन्च पर, Keychain साफ़ हो जाता है। वास्तविक डिवाइस पर, एप्लिकेशन हटाएँ — iOS उस डेवलपर के सभी Keychain रिकॉर्ड हटा देगा। चयनात्मक सफाई के लिए, उपयुक्त गुणों के साथ SecItemDelete कॉल करें।
हाँ, keychain access groups के माध्यम से। एप्लिकेशन के पास प्रोविज़निंग प्रोफ़ाइल में समान team ID और समान keychain-access-groups के साथ entitlements होने चाहिए। डेवलपर Xcode Capabilities में साझा पहुँच कॉन्फ़िगर करता है।
Apple कोई सख्त सीमा दस्तावेज़ित नहीं करता, लेकिन व्यवहार में प्रति रिकॉर्ड 1–4 KB से अधिक न करने की अनुशंसा की जाती है। बड़ी मात्रा के लिए, फ़ाइल एन्क्रिप्शन का उपयोग करें और कुंजी को Keychain में संग्रहीत करें, जबकि डेटा स्वयं Documents में हो।
जेलब्रेक वाले डिवाइस पर, Keychain सुरक्षा कम हो जाती है क्योंकि हमलावर को रूट पहुँच मिल जाती है और वह सीधे Keychain SQLite पढ़ सकता है। महत्वपूर्ण डेटा के लिए, सर्वर से प्राप्त कुंजी के साथ अतिरिक्त एन्क्रिप्शन का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें