Keychain — əsas anlayışlar, arxitektura və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-03-14 Oxuma vaxtı: 10 dəq

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, açarlar və sertifikatlar üçün aparat şifrələməsi olan iOS sistem anbarı
  • Security framework Keychain ilə işləmək üçün SecItemAdd, SecItemCopyMatching və SecItemDelete C-funksiyalarını təqdim edir
  • Keychain-ə giriş tətbiqin sandboxu ilə məhdudlaşdırılır, lakin keychain access groups vasitəsilə ümumi giriş mümkündür
  • kSecAttrAccessible atributu qoruma səviyyəsini təyin edir: Always-dan WhenUnlockedThisDeviceOnly-yə qədər
  • Keychain parolların, simmetrik və asimmetrik açarların, X.509 sertifikatlarının saxlanmasını dəstəkləyir

Keychain nədir?

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.

Tərif və məqsəd

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 iOS-da necə işləyir?

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 arxitekturası

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).

Məlumatların saxlanma prosesi

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.

swift
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-də məlumat növləri

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.

Parollar və hesablar

kSecClassGenericPasswordkSecClassInternetPassword 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.), kSecAttrPortkSecAttrPath göstərilə bilər. Bu, AutoFill vasitəsilə avtomatik doldurma zamanı yazını dəqiq müəyyən etməyə imkan verir.

Kriptoqrafik açarlar və sertifikatlar

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 sinfiTəyinatMəlumat növü
kSecClassGenericPasswordTətbiq paroluData (NSString)
kSecClassInternetPasswordServerə parolData + server atributları
kSecClassCertificateX.509 sertifikatıSecCertificate
kSecClassKeyKriptoqrafik açarSecKey
kSecClassIdentityAçar + sertifikatSecIdentity

API vasitəsilə Keychain ilə iş

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 və SecItemCopyMatching əsas əməliyyatları

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ı).

swift
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
}

Yazıların silinməsi və yenilənməsi

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.

swift
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)
}

Giriş səviyyələri və məlumatların qorunması

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.

Əlçatanlıq sabitləri

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 və sinxronizasiya

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.

Giriş səviyyəsinin seçilməsi üçün Best Practices

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

Keychain UserDefaults-dan nə ilə fərqlənir?

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.

Test zamanı Keychain-i necə təmizləmək olar?

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.

İki tətbiq ümumi Keychain-dən istifadə edə bilərmi?

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.

Keychain-də maksimal məlumat ölçüsü nədir?

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.

Keychain jailbreak zamanı təhlükəsizdirmi?

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ə

  • Keychain — parollar, açarlar və sertifikatlar üçün AES-256 aparat şifrələməsi ilə iOS-un qorunan anbarı
  • Security framework C-API təqdim edir: yazmaq üçün SecItemAdd, oxumaq üçün SecItemCopyMatching, silmək üçün SecItemDelete
  • Keychain məlumat sinifləri: GenericPassword, InternetPassword, Certificate, Key, Identity — hər biri öz atributlar dəsti ilə
  • kSecAttrAccessible giriş səviyyəsini idarə edir: WhenUnlocked, AfterFirstUnlock, Always, ThisDeviceOnly opsiyası ilə
  • iCloud Keychain yazıları cihazlar arasında kSecAttrSynchronizable atributu ilə end-to-end şifrələmə vasitəsilə sinxronlaşdırır
  • Biometriya (Face ID / Touch ID) Keychain-ə girişi kSecAccessControlBiometryCurrentSet vasitəsilə qoruyur
  • OAuth tokenlərini, parolları və kriptoqrafik açarları saxlamaq üçün Keychain-dən istifadə edin — sirləri UserDefaults-da saxlamayın

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.

Layihəni müzakirə et

Həm də oxuyun