Keychain iOS में एक सुरक्षित स्टोरेज है जो पासवर्ड, क्रिप्टोग्राफ़िक कुंजियाँ, प्रमाणपत्र और गोपनीय नोट्स को सुरक्षित रूप से संग्रहीत करने के लिए डिज़ाइन किया गया है। Apple Security Documentation (2025) के अनुसार, Keychain A7 चिप और नए वाले सभी उपकरणों पर Secure Enclave के माध्यम से हार्डवेयर एन्क्रिप्शन का उपयोग करता है। iOS Keychain की आर्किटेक्चर को समझना प्रत्येक डेवलपर के लिए एप्लिकेशन टोकन और सीक्रेट को सही ढंग से संग्रहीत करने के लिए आवश्यक है।
मुख्य बातें
iOS Keychain Apple के ऑपरेटिंग सिस्टम में निर्मित गोपनीय डेटा संग्रहीत करने की एक सुरक्षित प्रणाली है। UserDefaults या सामान्य फ़ाइलों के विपरीत, Keychain सभी आइटम को हार्डवेयर स्तर पर एन्क्रिप्ट करता है और सुरक्षा नीतियों के आधार पर बारीक पहुँच नियंत्रण प्रदान करता है।
Keychain को iOS 2.0 में पेश किया गया था और तब से इसमें महत्वपूर्ण बदलाव हुए हैं: iOS 7 में Secure Enclave के माध्यम से हार्डवेयर कुंजी समर्थन जोड़ा गया, iOS 9 में Access Groups के माध्यम से ऐप्स के बीच Keychain साझाकरण शुरू किया गया, iOS 13 में LAContext के माध्यम से बायोमेट्रिक बाइंडिंग समर्थन जोड़ा गया। Apple WWDC Session (2024) के अनुसार, App Store के शीर्ष 100 में 90% से अधिक iOS ऐप प्रमाणीकरण टोकन संग्रहीत करने के लिए Keychain का उपयोग करते हैं।
आर्किटेक्चरल रूप से, Keychain एप्लिकेशन सैंडबॉक्स के बाहर स्थित एक एन्क्रिप्टेड SQLite डेटाबेस है। प्रत्येक आइटम (SecItem) एक अलग कुंजी से एन्क्रिप्ट किया जाता है, जो बदले में Secure Enclave हार्डवेयर कुंजी द्वारा संरक्षित होता है। सिस्टम सेवा Securityd एप्लिकेशन एंटाइटलमेंट और अनुरोधित सुरक्षा वर्ग के आधार पर Keychain तक पहुँच का प्रबंधन करती है।
अन्य स्टोरेज विधियों की तुलना में Keychain का एक महत्वपूर्ण लाभ: डेटा OS द्वारा स्वचालित रूप से एन्क्रिप्ट और डिक्रिप्ट किया जाता है। डेवलपर को मैन्युअल रूप से क्रिप्टोग्राफी लागू करने की आवश्यकता नहीं है - बस सही पैरामीटर के साथ SecItemAdd को कॉल करें। iOS गारंटी देता है कि Keychain से डेटा अन्य एप्लिकेशन द्वारा नहीं पढ़ा जा सकता (जब Access Groups सही ढंग से कॉन्फ़िगर किए गए हों)।
Keychain आर्किटेक्चर में कई स्तर शामिल हैं: भौतिक (Secure Enclave), सिस्टम (Security.framework), एप्लिकेशन (SecItem* API) और तार्किक (Access Groups, Protection Classes)। प्रत्येक स्तर को समझना सीक्रेट स्टोरेज को सही ढंग से डिज़ाइन करने में मदद करता है।
Keychain के साथ काम करने के लिए मुख्य API Security framework के फ़ंक्शन हैं: SecItemAdd जोड़ने के लिए, SecItemCopyMatching पढ़ने के लिए, SecItemUpdate अपडेट करने के लिए और SecItemDelete हटाने के लिए। प्रत्येक फ़ंक्शन एक query शब्दकोश लेता है जो खोजे या संग्रहीत किए जाने वाले आइटम की विशेषताओं का वर्णन करता है।
मुख्य query विशेषताएँ: kSecClass - आइटम प्रकार (kSecClassGenericPassword, kSecClassKey, kSecClassCertificate), kSecAttrAccount - वर्ग के भीतर अद्वितीय पहचानकर्ता, kSecValueData - संग्रहीत डेटा (Data), kSecAttrAccessible - सुरक्षा वर्ग। SecItemCopyMatching kSecReturnData फ़्लैग के साथ आइटम डेटा लौटाता है, kSecMatchLimit के साथ - परिणामों की संख्या।
महत्वपूर्ण: सभी फ़ंक्शन एक OSStatus लौटाते हैं। सफल ऑपरेशन errSecSuccess (0) लौटाता है। त्रुटियाँ: errSecItemNotFound (-25300) - आइटम नहीं मिला, errSecDuplicateItem (-25299) - आइटम पहले से मौजूद है, errSecAuthFailed (-25293) - बायोमेट्रिक प्रमाणीकरण विफल। डेवलपर को प्रत्येक स्थिति को सही ढंग से संभालना चाहिए।
Protection Class kSecAttrAccessible विशेषता है जो निर्धारित करती है कि Keychain में डेटा पढ़ने के लिए कब उपलब्ध है। iOS उपलब्धता और सुरक्षा के विभिन्न स्तरों के साथ छह सुरक्षा वर्गों का समर्थन करता है।
अधिकांश परिदृश्यों के लिए अनुशंसित वर्ग kSecAttrAccessibleWhenUnlockedThisDeviceOnly है: डेटा केवल तभी उपलब्ध होता है जब डिवाइस अनलॉक हो और iCloud Backup में कॉपी नहीं किया जाता है। रीबूट के बाद उपलब्ध डेटा के लिए (लेकिन केवल पहले अनलॉक के बाद), kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly का उपयोग करें। महत्वपूर्ण डेटा के लिए जिसे प्रत्येक पहुँच पर बायोमेट्रिक प्रमाणीकरण की आवश्यकता है, kSecAttrAccessibleWhenUnlockedThisDeviceOnly को बायोमेट्री की आवश्यकता वाले ACL के साथ जोड़ें।
ThisDeviceOnly प्रत्यय के बिना वर्ग (kSecAttrAccessibleWhenUnlocked, kSecAttrAccessibleAfterFirstUnlock) iCloud Backup में कॉपी करने की अनुमति देते हैं। यह उपयोगकर्ता के लिए सुविधाजनक है लेकिन सुरक्षा कम करता है - डेटा बैकअप से पुनर्स्थापित किया जा सकता है। प्रमाणीकरण टोकन के लिए, हमेशा ThisDeviceOnly का उपयोग करें।
Access Control List (ACL) एक प्रणाली है जो उपयोगकर्ता प्रमाणीकरण के आधार पर Keychain आइटम पर संचालन को प्रतिबंधित करती है। ACL को SecAccessControlCreateWithFlags के माध्यम से सेट किया जाता है और आइटम सहेजते समय kSecAttrAccessControl विशेषता में पास किया जाता है।
समर्थित फ़्लैग: kSecAccessControlUserPresence - कोई भी प्रमाणीकरण (Face ID, Touch ID, या पासकोड), kSecAccessControlBiometryCurrentSet - केवल बायोमेट्री (वर्तमान में पंजीकृत फिंगरप्रिंट या चेहरा), kSecAccessControlDevicePasscode - केवल पासकोड। ACL प्रत्येक ऑपरेशन पर लागू होता है: आइटम को पढ़ना, अपडेट करना और हटाना भी प्रमाणीकरण की आवश्यकता है।
iOS 15+ पर फ़्लैग kSecAccessControlWatch दिखाई दिया - Apple Watch के लिए, जो पेयर की गई घड़ी के माध्यम से प्रमाणीकरण की अनुमति देता है। ACL को जोड़ा जा सकता है: उदाहरण के लिए, kSecAccessControlUserPresence या kSecAccessControlBiometryAny वैकल्पिक पासकोड (.or ओरिएंटेशन) के साथ।
iOS Keychain चार मुख्य आइटम वर्गों (kSecClass) का समर्थन करता है, प्रत्येक अपने स्वयं के डेटा प्रकार के लिए डिज़ाइन किया गया है। सही वर्ग चुनना संगठन और आइटम खोज को सरल बनाता है।
kSecClassGenericPassword - सामान्य पासवर्ड: सबसे अधिक उपयोग किया जाने वाला वर्ग। एक अद्वितीय कुंजी (kSecAttrAccount) के साथ मनमाना बाइनरी डेटा (Data) संग्रहीत करता है। टोकन, API कुंजियाँ, PIN कोड के लिए उपयुक्त। उपयोग के लिए अतिरिक्त एंटाइटलमेंट की आवश्यकता नहीं है।
kSecClassInternetPassword - इंटरनेट पासवर्ड: नेटवर्क संसाधन से जुड़े डेटा को संग्रहीत करता है। अतिरिक्त विशेषताएँ: kSecAttrServer (सर्वर डोमेन), kSecAttrProtocol (https, ftp), kSecAttrPort, kSecAttrAuthenticationType। iOS AutoFill के माध्यम से ऐसे पासवर्ड स्वचालित रूप से भर सकता है।
kSecClassKey - क्रिप्टोग्राफ़िक कुंजी: एन्क्रिप्शन कुंजियाँ (AES, RSA, EC) संग्रहीत करने के लिए। कुंजी SecKeyRef के रूप में संग्रहीत की जाती है, Data के रूप में नहीं। kSecClassCertificate - डिजिटल प्रमाणपत्र संग्रहीत करने और सत्यापित करने के लिए X.509 प्रमाणपत्र। दोनों वर्गों में क्रिप्टोग्राफ़िक संचालन और उचित विशेषता कॉन्फ़िगरेशन की समझ आवश्यक है।
व्यवहार में, मोबाइल ऐप में Keychain के 95% उपयोग प्रमाणीकरण टोकन संग्रहीत करने के लिए kSecClassGenericPassword और निजी एन्क्रिप्शन कुंजियाँ संग्रहीत करने के लिए kSecClassKey द्वारा कवर किए जाते हैं। kSecClassCertificate का उपयोग शायद ही कभी किया जाता है - आमतौर पर अपने स्वयं के PKI वाले एंटरप्राइज़ ऐप में।
आइए Security framework का उपयोग करके Swift में Keychain के साथ काम करने के व्यावहारिक उदाहरण देखें। प्रत्येक उदाहरण में त्रुटि प्रबंधन और उचित Protection Class कॉन्फ़िगरेशन शामिल है।
एक मूल उदाहरण WhenUnlockedThisDeviceOnly सुरक्षा के साथ Keychain में प्रमाणीकरण टोकन सहेजता है। कुंजी (kSecAttrAccount) सेवा पहचानकर्ता है, डेटा (kSecValueData) Data प्रारूप में टोकन है।
import Security
enum KeychainError: Error {
case unexpectedStatus(OSStatus)
}
func saveToken(token: String, service: String) throws {
let data = Data(token.utf8)
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: "auth_token",
kSecValueData as String: data,
kSecAttrAccessible as String:
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
throw KeychainError.unexpectedStatus(status)
}
}
func readToken(service: String) throws -> String {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecAttrAccount as String: "auth_token",
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]
var result: AnyObject?
let status = SecItemCopyMatching(
query as CFDictionary, &result
)
guard status == errSecSuccess,
let data = result as? Data else {
throw KeychainError.unexpectedStatus(status)
}
return String(decoding: data, as: UTF8.self)
}
उदाहरण कुंजी को बायोमेट्री से जोड़ने के लिए SecAccessControlCreateWithFlags के उपयोग को दर्शाता है। आइटम तक प्रत्येक पहुँच के लिए Face ID या Touch ID की आवश्यकता होगी।
import LocalAuthentication
func saveWithBiometry(data: Data, key: String) throws {
let accessControl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.biometryCurrentSet,
nil
)
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessControl as String: accessControl as Any
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
throw KeychainError.unexpectedStatus(status)
}
}
उदाहरण एक ही डेवलपर के ऐप्स के बीच साझा Keychain पहुँच के लिए Access Group कॉन्फ़िगर करना दिखाता है। keychain-access-groups एंटाइटलमेंट की आवश्यकता है।
// Capabilities: Keychain Sharing सक्षम
// App IDs: group.com.example.shared
func saveSharedToken(token: Data) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "shared_token",
kSecValueData as String: token,
kSecAttrAccessGroup as String:
"group.com.example.shared",
kSecAttrAccessible as String:
kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemAdd(query as CFDictionary, nil)
}
iOS Keychain का सही उपयोग कई प्रमुख नियमों का पालन करने की आवश्यकता है जो सामान्य कमजोरियों और डेटा हानि को रोकते हैं।
सभी प्रमाणीकरण सीक्रेट के लिए ThisDeviceOnly का उपयोग करें: kSecAttrAccessibleWhenUnlockedThisDeviceOnly सुनिश्चित करता है कि टोकन iCloud Backup में न जाएँ। यदि कोई हमलावर बैकअप तक पहुँच प्राप्त करता है, तो इस फ़्लैग वाला Keychain डेटा उपलब्ध नहीं होगा। अपवाद वह डेटा है जो उपयोगकर्ता के सभी उपकरणों पर उपलब्ध होना चाहिए (जैसे, मालिकाना सेवाओं के लिए एन्क्रिप्शन कुंजियाँ), जिसके लिए kSecAttrAccessibleWhenUnlocked को kSecAttrSynchronizable के साथ उपयोग करें।
कच्चे पासवर्ड संग्रहीत न करें - हैश या सत्र टोकन संग्रहीत करें। Apple Security Guide (2025) Keychain में उपयोगकर्ता पासवर्ड को सादे टेक्स्ट में कभी न सहेजने की सलाह देता है। इसके बजाय, OAuth 2.0 के माध्यम से सफल प्रमाणीकरण के बाद सर्वर से प्राप्त रिफ्रेश टोकन सहेजें। पासवर्ड केवल टोकन प्राप्त करने के लिए उपयोग किया जाता है और तुरंत मेमोरी से हटा दिया जाता है।
Keychain त्रुटियों को सही ढंग से संभालें: प्रत्येक Keychain ऑपरेशन एक OSStatus लौटाता है जिसे जाँचा जाना चाहिए। errSecItemNotFound (टोकन समाप्त या हटाया गया) और errSecAuthFailed (बायोमेट्री विफल) पर विशेष ध्यान दें। पहले मामले में, ऐप को नया प्रमाणीकरण अनुरोध करना चाहिए; दूसरे में, उपयोगकर्ता को एक वैकल्पिक विधि (पासकोड) दिखाएँ। कभी भी errSecItemNotFound स्थिति को अनदेखा न करें - इससे nil पढ़ने का प्रयास करने पर ऐप क्रैश हो जाएगा।
Keychain को वास्तविक डिवाइस पर परीक्षण करें: सिम्युलेटर में Secure Enclave नहीं है और बायोमेट्रिक ACL का समर्थन नहीं करता है। हमेशा परिदृश्यों की जाँच करें: पहला लॉन्च, बैकअप से पुनर्स्थापना, डिवाइस पासवर्ड बदलना, ऐप हटाना और पुनः इंस्टॉल करना। वास्तविक डिवाइस पर, ऐप हटाए जाने पर Keychain बना रहता है, लेकिन केवल तभी जब kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly फ़्लैग का उपयोग नहीं किया गया था, जो पासकोड हटाए जाने पर साफ़ हो जाता है।
Keychain संचालन की संख्या कम करें: प्रत्येक रीड या राइट ऑपरेशन सिस्टम सेवा Securityd को कॉल है, जो थ्रेड को ब्लॉक कर सकता है। सत्र की अवधि के लिए पढ़े गए टोकन को मेमोरी में कैश करें और केवल ऐप रीस्टार्ट या प्रमाणीकरण त्रुटि (सर्वर से 401) पर फिर से Keychain तक पहुँचें। iOS डिवाइस लॉक होने पर स्वचालित रूप से Keychain को लॉक कर देता है, इसलिए बायोमेट्रिक अनुरोध के साथ LAContext के माध्यम से पढ़ने की योजना बनाएँ।
अक्सर पूछे जाने वाले प्रश्न
हाँ, सुरक्षा वर्ग kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly या kSecAttrAccessibleAfterFirstUnlock का उपयोग करें। रीबूट के बाद पहले डिवाइस अनलॉक के बाद डेटा उपलब्ध होगा। ऐप लॉन्च पर स्वचालित पहुँच के लिए (अनलॉक की प्रतीक्षा किए बिना), kSecAttrAccessibleAlways का उपयोग करें, लेकिन यह सुरक्षा कम करता है।
प्रत्येक डेटा प्रकार के लिए kSecClass वाले query के साथ SecItemDelete को कॉल करें। सभी ऐप आइटम की पूर्ण सफाई के लिए, निष्पादित करें: SecItemDelete([kSecClass as String: kSecClassGenericPassword] as CFDictionary)। kSecClassKey, kSecClassCertificate और kSecClassInternetPassword के लिए दोहराएँ।
kSecAttrAccessible निर्धारित करता है कि डेटा कब उपलब्ध है (अनलॉक पर, पहले अनलॉक के बाद, आदि)। kSecAttrAccessControl निर्धारित करता है कि कौन पहुँच सकता है (बायोमेट्री, पासकोड, कोई भी प्रमाणीकरण)। वे संयुक्त होते हैं: पहले Protection Class, फिर ACL। उदाहरण के लिए, डेटा केवल अनलॉक पर और केवल Face ID के बाद उपलब्ध है।
कारण: आइटम कभी सहेजा नहीं गया, पासकोड हटाए जाने पर आइटम हटा दिया गया (यदि kSecAttrAccessibleWhenPasscodeSet का उपयोग किया गया था), ऐप पुनः इंस्टॉल किया गया (Keychain बना रहता है लेकिन नए डिवाइस पर बैकअप से पुनर्स्थापित नहीं होता), Access Group या डेवलपर टीम पहचानकर्ता बदल गया। kSecAttrService और kSecAttrAccount की जाँच करें।
LocalAuthentication से LAContext का उपयोग करें: context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) कॉल करें। यदि true लौटाता है - डिवाइस Touch ID या Face ID का समर्थन करता है। Keychain ACL के लिए, biometryCurrentSet फ़्लैग (केवल वर्तमान बायोमेट्रिक डेटा) या biometryAny (पहले पंजीकृत कोई भी) का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें