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) ذخیرہ کرنے کے لیے۔ کلید Data کے بجائے SecKeyRef کے طور پر محفوظ کی جاتی ہے۔ 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 نہیں ہے اور بائیو میٹرک ACLs کو سپورٹ نہیں کرتا۔ ہمیشہ منظرناموں کی جانچ کریں: پہلا لانچ، بیک اپ سے بحالی، ڈیوائس پاس ورڈ تبدیل کرنا، ایپ کو حذف کرنا اور دوبارہ انسٹال کرنا۔ حقیقی ڈیوائس پر، ایپ حذف ہونے پر 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں