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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন