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 تک رسائی حاصل کرتی ہے، جو securityd ڈیمون کے ساتھ بات چیت کرتا ہے جو انکرپٹڈ SQLite Keychain ڈیٹا بیس کا انتظام کرتا ہے۔ ہر ریکارڈ ایک الگ کلید سے انکرپٹ کیا جاتا ہے، اور کیز خود 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں