Keychain — iOS, watchOS, macOS və tvOS-da aparat səviyyəsində parolları, açarları və sertifikatları idarə edən qorunan etimad məlumatları anbarıdır. UserDefaults-dan fərqli olaraq, Keychain-dəki məlumatlar şifrələnir və tətbiqin sandboxu ilə təcrid olunur. Apple Developer Documentation-ya görə, Keychain məxfi məlumatları qorumaq üçün Secure Enclave mexanizmlərindən və AES-256 aparat şifrələməsindən istifadə edir.
Əsas məqamlar
Keychain — parolların, kriptoqrafik açarların, sertifikatların və digər məxfi məlumatların təhlükəsiz saxlanması üçün nəzərdə tutulmuş Apple əməliyyat sisteminin təhlükəsiz verilənlər bazasıdır. Keychain ilk dəfə 1999-cu ildə Mac OS 8.6-da, iOS-da isə ilk SDK versiyasından etibarən ortaya çıxmışdır.
Keychain mobil inkişafın fundamental problemini həll edir: qorunmayan fayl sistemində sirlərin (tokenlər, parollar, şifrələmə açarları) saxlanması. UserDefaults və ya SQLite-dən fərqli olaraq, Keychain-dəki məlumatlar şifrələnmiş formada saxlanılır və diskə yazıldıqda avtomatik şifrələnir.
Hər bir iOS tətbiqi təcrid olunmuş sandboxda işləyir və yalnız öz keychain-inə giriş əldə edir. Lakin tərtibatçı keychain access groups vasitəsilə bir tərtibatçının tətbiqləri arasında Keychain-ə ümumi girişi konfiqurasiya edə bilər. iCloud Keychain istifadəçisi əlavə olaraq məlumatları cihazlar arasında end-to-end şifrələmə vasitəsilə sinxronlaşdırır.
Apple Security White Paper (2025)-ə görə, Keychain cihazın unikal identifikatoruna (UID) bağlı açarla AES-256 aparat şifrələməsindən istifadə edir ki, bu da məlumatları cihazdan çıxarıldıqda əlçatmaz edir.
Keychain səviyyəli xidmət kimi fəaliyyət göstərir: tətbiq Security framework-ə müraciət edir, o da şifrələnmiş SQLite Keychain bazasını idarə edən securityd demonu ilə qarşılıqlı əlaqədə olur. Hər bir yazı ayrıca açarla şifrələnir, açarların özləri isə A7 çipi və daha yeni cihazlarda Secure Enclave aparat modulu ilə qorunur.
Security framework Keychain Services ilə işləmək üçün C interfeysi təqdim edir. Əsas funksiyalar: SecItemAdd (əlavə etmə), SecItemCopyMatching (axtarış), SecItemUpdate (yeniləmə) və SecItemDelete (silme). Hər bir əməliyyat sorğu növünü təsvir edən CFDictionaryRef atributlar lüğətini qəbul edir.
Məlumatlar siniflərə görə təsnif edilir: kSecClassGenericPassword (ixtiyari parol), kSecClassInternetPassword (internet xidmətinə parol), kSecClassCertificate (sertifikat), kSecClassKey (kriptoqrafik açar) və kSecClassIdentity (açar və sertifikat birləşməsi).
Parol saxlanarkən tətbiq atributları olan lüğət yaradır: xidmət, hesab, giriş səviyyəsi, etiket. Security framework məlumatları securityd demonuna ötürür, o da yazını cihaza bağlı açarla şifrələyir və Keychain SQLite-də saxlayır. Çıxarma eyni şəkildə baş verir: atributlara görə sorğu, axtarış, şifrənin açılması və məlumatların qaytarılması.
Vacib xüsusiyyət: tətbiq silindikdə iOS avtomatik olaraq bu tətbiq tərəfindən yaradılmış Keychain yazılarını təmizləyir (iOS 10.3+-dan etibarən). Tətbiq yenidən quraşdırıldıqda, əvvəlki quraşdırmanın Keychain məlumatları, əgər iCloud Keychain istifadə edilməyibsə, əlçatmaz olur.
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 beş əsas məlumat sinfini dəstəkləyir, hər birinin öz atributlar dəsti və tətbiq sahəsi var. Sinif seçimindən hansı axtarış açarlarının mövcud olması və məlumatların necə şifrələnməsi asılıdır.
kSecClassGenericPassword və kSecClassInternetPassword sinifləri mətn parollarının saxlanması üçün nəzərdə tutulub. İnternet versiyası əlavə olaraq server məlumatlarını saxlayır: domen, protokol, port və autentifikasiya yolu. GenericPassword serverə bağlanmadan istənilən parolların saxlanması üçün istifadə olunur.
İnternet parolu saxlanarkən kSecAttrServer (domen), kSecAttrProtocol (HTTPS, FTP və s.), kSecAttrPort və kSecAttrPath göstərilə bilər. Bu, AutoFill vasitəsilə avtomatik doldurma zamanı yazını dəqiq müəyyən etməyə imkan verir.
kSecClassKey sinfi simmetrik (AES) və asimmetrik (RSA, EC) açarları saxlayır. kSecClassCertificate sinfi — X.509 sertifikatları. kSecClassIdentity sinfi şəxsi açarı və müvafiq sertifikatı bir yazıda birləşdirir.
Asimmetrik açarlar üçün Keychain atributları dəstəkləyir: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (Keychain-də saxlamaq). Sertifikatlar üçün: kSecAttrLabel (insan oxuya bilən ad), kSecAttrSubject (sahibin DN), kSecAttrIssuer (verənin DN).
| Keychain sinfi | Təyinat | Məlumat növü |
|---|---|---|
| kSecClassGenericPassword | Tətbiq parolu | Data (NSString) |
| kSecClassInternetPassword | Serverə parol | Data + server atributları |
| kSecClassCertificate | X.509 sertifikatı | SecCertificate |
| kSecClassKey | Kriptoqrafik açar | SecKey |
| kSecClassIdentity | Açar + sertifikat | SecIdentity |
Yerli iOS kodunda Keychain ilə qarşılıqlı əlaqənin əsas interfeysi — Security framework funksiyaları. Swift və Objective-C üçün rahat funksiyalara bükülmüş bir C interfeysi mövcuddur.
SecItemAdd funksiyası Keychain-ə yeni element əlavə edir. Girişdə sinif, məlumatlar və atributlarla lüğət qəbul edir. errSecSuccess (0) statusu və ya xəta kodu qaytarır. SecItemCopyMatching funksiyası atributlara görə axtarış aparır və tapılan məlumatları qaytarır.
Axtarış üçün kSecReturnData bayrağı istifadə olunur — əgər true-dursa, funksiya yazının məzmununu qaytarır. kSecMatchLimit bayrağı nəticələrin sayını təyin edir: kSecMatchLimitOne (bir) və ya kSecMatchLimitAll (hamısı).
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 mövcud yazının atributlarını və ya məlumatlarını dəyişməyə imkan verir. SecItemDelete ötürülən lüğətə uyğun gələn bütün yazıları silir. Silərkən təsadüfən shared keychain-də başqalarının yazılarını silməmək üçün kifayət qədər atribut göstərmək vacibdir.
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)
}
Hər bir Keychain yazısının kSecAttrAccessible atributu var, bu da məlumatların nə vaxt oxumaq üçün əlçatan olduğunu müəyyən edir. Bu təhlükəsizlik üçün kritik əhəmiyyət daşıyır: səhv giriş səviyyəsi məlumatları həssas edə və ya əksinə, lazımi anda əlçatmaz edə bilər.
kSecAttrAccessibleWhenUnlocked — məlumatlar yalnız cihaz kiliddən açıldıqda əlçatandır. kSecAttrAccessibleAfterFirstUnlock — yenidən yükləmədən sonra ilk kilid açıldıqdan sonra əlçatandır. kSecAttrAccessibleAlways — həmişə əlçatandır (tövsiyə edilmir). ThisDeviceOnly postfiksi məlumatların ehtiyat nüsxə vasitəsilə köçürülməsini qadağan edir.
Secure Enclave olan cihazlarda Keychain şifrələmə açarı əlavə olaraq biometriya ilə qoruna bilər: kSecAccessControlBiometryCurrentSet və ya kSecAccessControlUserPresence. Bu, hər oxu əməliyyatı üçün Face ID və ya Touch ID tələbi əlavə edir.
iCloud Keychain yazıları Apple cihazları arasında end-to-end şifrələmə vasitəsilə sinxronlaşdırır. Apple-ın şifrəsi açılmış məlumatlara girişi yoxdur. Sinxronizasiyanı aktivləşdirmək üçün kSecAttrSynchronizable atributunu kCFBooleanTrue dəyəri ilə əlavə edin.
Vacibdir: sinxronlaşdırılan yazılar ThisDeviceOnly atributunu ehtiva edə bilməz, çünki onlar digər cihazlarda əlçatan olmalıdır. Bütün cihazlar itirildikdə iCloud Keychain bərpa kodu və ya iCloud ehtiyat açarı vasitəsilə bərpa olunur.
Autentifikasiya tokenləri üçün kSecAttrAccessibleWhenUnlockedThisDeviceOnly istifadə edin — məlumatlar yalnız kiliddən açılmış cihazda əlçatandır və ehtiyat nüsxəyə kopyalanmır. Fon tapşırıqları üçün əlçatan olmalı sertifikatlar üçün kSecAttrAccessibleAfterFirstUnlock istifadə edin. Məxfi məlumatlar üçün heç vaxt kSecAttrAccessibleAlways istifadə etməyin.
Sinxronizasiya tələb etməyən məlumatlar üçün həmişə ThisDeviceOnly postfiksini əlavə etmək tövsiyə olunur. Bu, sirlərin təsadüfən iCloud və ya iTunes backup-a kopyalanmasının qarşısını alır, burada onlar analiz alətləri ilə çıxarıla bilər. Kritik məlumatlar üçün əlçatanlığı kSecAccessControlUserPresence ilə birləşdirin — bu, yazının şifrəsini açmaq üçün biometriya və ya kod tələbi əlavə edir.
iCloud Keychain istifadə edərkən nəzərə alın ki, sinxronlaşdırılan yazılar istifadəçinin bütün cihazlarında əlçatandır: əgər təcavüzkar bir cihaza giriş əldə edərsə, məlumatlar bütün cihazlarda kompromizə ola bilər. Təcrid olunmuş sirlər üçün ThisDeviceOnly istifadə edin.
Tez-tez verilən suallar
UserDefaults məlumatları IPA analizi zamanı əlçatan olan .plist faylında açıq formada saxlayır. Keychain hər yazını ayrıca şifrələyir, aparat şifrələməsindən istifadə edir və giriş səviyyələrini, biometriyanı və iCloud vasitəsilə sinxronizasiyanı dəstəkləyir.
iOS simulyatorunda hər işə salınmada Keychain təmizlənir. Real cihazda tətbiqi silin — iOS bu tərtibatçının bütün Keychain yazılarını siləcək. Seçmə təmizləmə üçün müvafiq atributlarla SecItemDelete-i çağırın.
Bəli, keychain access groups vasitəsilə. Tətbiqlər imzada eyni team ID-yə və eyni keychain-access-groups ilə entitlements-ə malik olmalıdır. Tərtibatçı Xcode Capabilities-də ümumi girişi konfiqurasiya edir.
Apple ciddi limit sənədləşdirmir, lakin praktikada yazı başına 1–4 KB-dan çox olmamaq tövsiyə olunur. Böyük həcmlər üçün fayl şifrələməsi və açarın Keychain-də saxlanması, məlumatların özünün isə Documents-da saxlanması istifadə edin.
Jailbreak zamanı Keychain-in qorunması azalır, çünki təcavüzkar root girişi əldə edir və Keychain SQLite-ni birbaşa oxuya bilər. Kritik məlumatlar üçün serverdən alınan açarla əlavə şifrələmədən istifadə edin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun