Keychain — Temel kavramlar, mimari ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-03-14 Okuma süresi: 10 dk

Keychain, iOS, watchOS, macOS ve tvOS'te donanım düzeyinde şifreleri, anahtarları ve sertifikaları yöneten güvenli bir kimlik bilgisi deposudur. UserDefaults'ın aksine, Keychain'deki veriler şifrelenir ve uygulama sandbox'ına göre izole edilir. Apple Developer Documentation'ya göre Keychain, hassas bilgileri korumak için Secure Enclave mekanizmalarını ve AES-256 donanım şifrelemesini kullanır.

Önemli Noktalar

  • Keychain — donanım şifrelemesi ile şifreler, anahtarlar ve sertifikalar için iOS sistem deposu
  • Security framework, Keychain ile çalışmak için C işlevleri SecItemAdd, SecItemCopyMatching ve SecItemDelete sağlar
  • Keychain'e erişim uygulama sandbox'ı ile sınırlıdır, ancak keychain access groups aracılığıyla paylaşımlı erişim mümkündür
  • kSecAttrAccessible özniteliği koruma seviyesini tanımlar: Always'den WhenUnlockedThisDeviceOnly'ye kadar
  • Keychain şifrelerin, simetrik ve asimetrik anahtarların, X.509 sertifikalarının depolanmasını destekler

Keychain Nedir?

Keychain, şifrelerin, kriptografik anahtarların, sertifikaların ve diğer hassas verilerin güvenli bir şekilde depolanması için tasarlanmış Apple işletim sisteminin güvenli bir veritabanıdır. Keychain ilk olarak 1999'da Mac OS 8.6'da ve iOS'ta — ilk SDK sürümünden itibaren ortaya çıkmıştır.

Tanım ve Amaç

Keychain, mobil geliştirmenin temel bir sorununu çözer: güvenli olmayan bir dosya sisteminde sırların (token'lar, şifreler, şifreleme anahtarları) saklanması. UserDefaults veya SQLite'ın aksine, Keychain'deki veriler şifrelenmiş olarak depolanır ve diske yazılırken otomatik olarak şifrelenir.

Her iOS uygulaması izole bir sandbox'ta çalışır ve yalnızca kendi keychain'ine erişebilir. Ancak geliştirici, keychain access groups aracılığıyla aynı geliştiricinin uygulamaları arasında paylaşımlı Keychain erişimi yapılandırabilir. Kullanıcının iCloud Keychain'i, uçtan uca şifreleme yoluyla cihazlar arasında veri senkronize eder.

Apple Security White Paper (2025)'e göre Keychain, benzersiz cihaz tanımlayıcısına (UID) bağlı bir anahtarla AES-256 donanım şifrelemesi kullanır ve bu da verileri cihazdan çıkarıldığında erişilemez hale getirir.

iOS'ta Keychain Nasıl Çalışır?

Keychain, katmanlı bir hizmet olarak çalışır: uygulama Security framework'e erişir, bu framework şifrelenmiş SQLite Keychain veritabanını yöneten securityd arka plan programı ile iletişim kurar. Her kayıt ayrı bir anahtarla şifrelenir ve anahtarların kendisi A7 çipli ve daha yeni cihazlarda Secure Enclave donanım modülü tarafından korunur.

Security Framework Mimarisi

Security framework, Keychain Services ile çalışmak için bir C arayüzü sağlar. Ana işlevler: SecItemAdd (ekleme), SecItemCopyMatching (arama), SecItemUpdate (güncelleme) ve SecItemDelete (silme). Her işlem, istek türünü tanımlayan bir CFDictionaryRef öznitelik sözlüğü alır.

Veriler sınıflara göre sınıflandırılır: kSecClassGenericPassword (rastgele şifre), kSecClassInternetPassword (İnternet hizmeti şifresi), kSecClassCertificate (sertifika), kSecClassKey (kriptografik anahtar) ve kSecClassIdentity (anahtar-sertifika çifti).

Veri Kaydetme Süreci

Bir şifre kaydedilirken uygulama, özniteliklerle bir sözlük oluşturur: hizmet, hesap, erişim seviyesi, etiket. Security framework verileri securityd arka plan programına iletir, bu program kaydı cihaza bağlı bir anahtarla şifreler ve Keychain SQLite'ında saklar. Geri alma benzer şekilde çalışır: özniteliklere göre sorgulama, arama, şifre çözme ve veri döndürme.

Önemli bir özellik: bir uygulama silindiğinde, iOS otomatik olarak bu uygulama tarafından oluşturulan Keychain kayıtlarını temizler (iOS 10.3+ ile birlikte). Uygulama yeniden yüklendiğinde, iCloud Keychain kullanılmadıysa önceki yüklemenin Keychain verileri kullanılamaz.

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'de Veri Türleri

Keychain, her biri kendi öznitelik kümesine ve uygulama alanına sahip beş ana veri sınıfını destekler. Sınıf seçimi, hangi arama anahtarlarının mevcut olduğunu ve verilerin nasıl şifrelendiğini belirler.

Şifreler ve Hesaplar

kSecClassGenericPassword ve kSecClassInternetPassword sınıfları, metin şifrelerini depolamak için tasarlanmıştır. İnternet sürümü ayrıca sunucu verilerini de saklar: alan adı, protokol, bağlantı noktası ve kimlik doğrulama yolu. GenericPassword, sunucu bağlaması olmadan herhangi bir şifreyi depolamak için kullanılır.

Bir İnternet şifresi kaydedilirken kSecAttrServer (alan adı), kSecAttrProtocol (HTTPS, FTP, vb.), kSecAttrPort ve kSecAttrPath belirtilebilir. Bu, AutoFill aracılığıyla otomatik doldurma sırasında kaydın tam olarak tanımlanmasını sağlar.

Kriptografik Anahtarlar ve Sertifikalar

kSecClassKey sınıfı simetrik (AES) ve asimetrik (RSA, EC) anahtarları saklar. kSecClassCertificate sınıfı X.509 sertifikalarını saklar. kSecClassIdentity sınıfı, özel bir anahtarı ve karşılık gelen sertifikayı tek bir kayıtta birleştirir.

Asimetrik anahtarlar için Keychain öznitelikleri destekler: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (Keychain'e kaydedilsin mi). Sertifikalar için: kSecAttrLabel (insan tarafından okunabilir ad), kSecAttrSubject (sahibin DN'si), kSecAttrIssuer (yayıncının DN'si).

Keychain SınıfıAmaçVeri Türü
kSecClassGenericPasswordUygulama şifresiData (NSString)
kSecClassInternetPasswordSunucu şifresiData + sunucu öznitelikleri
kSecClassCertificateX.509 sertifikasıSecCertificate
kSecClassKeyKriptografik anahtarSecKey
kSecClassIdentityAnahtar + sertifikaSecIdentity

API Aracılığıyla Keychain ile Çalışma

Yerel iOS kodunda Keychain ile etkileşim kurmanın ana arayüzü, Security framework işlevleridir. Swift ve Objective-C için, kullanışlı işlevlere sarılmış tek bir C arayüzü mevcuttur.

Temel İşlemler SecItemAdd ve SecItemCopyMatching

SecItemAdd işlevi, Keychain'e yeni bir öğe ekler. Girdi olarak sınıf, veri ve öznitelikler içeren bir sözlük alır. errSecSuccess (0) durumunu veya bir hata kodunu döndürür. SecItemCopyMatching işlevi, özniteliklere göre arama yapar ve bulunan verileri döndürür.

Arama için kSecReturnData bayrağı kullanılır — true ise, işlev kaydın içeriğini döndürür. kSecMatchLimit bayrağı sonuç sayısını belirler: kSecMatchLimitOne (bir) veya kSecMatchLimitAll (tümü).

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
}

Kayıtları Silme ve Güncelleme

SecItemUpdate, mevcut bir kaydın özniteliklerini veya verilerini değiştirmeye izin verir. SecItemDelete, iletilen sözlükle eşleşen tüm kayıtları siler. Silme sırasında, paylaşılan keychain'deki diğer kayıtları yanlışlıkla silmemek için yeterli sayıda öznitelik belirtmek önemlidir.

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

Erişim Seviyeleri ve Veri Koruması

Her Keychain kaydının, verilerin ne zaman okumaya uygun olduğunu belirleyen kSecAttrAccessible özniteliği vardır. Bu, güvenlik için kritik öneme sahiptir: yanlış erişim seviyesi verileri savunmasız hale getirebilir veya tam tersine, ihtiyaç duyulduğunda kullanılamaz hale getirebilir.

Kullanılabilirlik Sabitleri

kSecAttrAccessibleWhenUnlocked — veriler yalnızca cihazın kilidi açıldığında kullanılabilir. kSecAttrAccessibleAfterFirstUnlock — yeniden başlatmadan sonraki ilk kilit açma işleminden sonra kullanılabilir. kSecAttrAccessibleAlways — her zaman kullanılabilir (önerilmez). ThisDeviceOnly soneki, yedekleme yoluyla veri aktarımını engeller.

Secure Enclave'e sahip cihazlarda, Keychain şifreleme anahtarı biyometri ile ek olarak korunabilir: kSecAccessControlBiometryCurrentSet veya kSecAccessControlUserPresence. Bu, her okuma işlemi için Face ID veya Touch ID gereksinimi ekler.

iCloud Keychain ve Senkronizasyon

iCloud Keychain, uçtan uca şifreleme yoluyla Apple cihazları arasında kayıtları senkronize eder. Apple'ın şifresi çözülmüş verilere erişimi yoktur. Senkronizasyonu etkinleştirmek için kSecAttrSynchronizable özniteliğini kCFBooleanTrue değeriyle ekleyin.

Önemli: senkronize edilen kayıtlar ThisDeviceOnly özniteliğini içeremez, çünkü diğer cihazlarda kullanılabilir olmaları gerekir. Tüm cihazlar kaybolursa, iCloud Keychain bir kurtarma kodu veya iCloud kurtarma anahtarı aracılığıyla geri yüklenebilir.

Erişim Seviyesi Seçimi için En İyi Uygulamalar

Kimlik doğrulama token'ları için kSecAttrAccessibleWhenUnlockedThisDeviceOnly kullanın — veriler yalnızca cihazın kilidi açıkken kullanılabilir ve yedeklemeye kopyalanmaz. Arka plan görevleri için kullanılabilir olması gereken sertifikalar için kSecAttrAccessibleAfterFirstUnlock kullanın. Hassas veriler için kSecAttrAccessibleAlways'i asla kullanmayın.

Senkronizasyon gerektirmeyen veriler için her zaman ThisDeviceOnly sonekinin eklenmesi önerilir. Bu, analiz araçlarıyla çıkarılabilecekleri iCloud veya iTunes yedeklemesine sırların yanlışlıkla kopyalanmasını önler. Kritik veriler için kullanılabilirliği kSecAccessControlUserPresence ile birleştirin — bu, kaydın şifresini çözmek için biyometrik veya parola gereksinimi ekler.

iCloud Keychain kullanırken, senkronize edilen kayıtların tüm kullanıcı cihazlarında kullanılabilir olduğunu unutmayın: bir saldırgan bir cihaza erişim sağlarsa, veriler tüm cihazlarda tehlikeye girebilir. İzole sırlar için ThisDeviceOnly kullanın.

Sıkça Sorulan Sorular

Keychain, UserDefaults'tan nasıl farklıdır?

UserDefaults verileri düz metin olarak .plist dosyasında saklar ve IPA analizi sırasında erişilebilir. Keychain her kaydı ayrı ayrı şifreler, donanım şifrelemesi kullanır ve erişim seviyelerini, biyometriyi ve iCloud üzerinden senkronizasyonu destekler.

Test sırasında Keychain nasıl temizlenir?

Her iOS simülatörü başlatıldığında Keychain temizlenir. Gerçek bir cihazda, uygulamayı silin — iOS o geliştiricinin tüm Keychain kayıtlarını kaldırır. Seçmeli temizlik için uygun özniteliklerle SecItemDelete'i çağırın.

İki uygulama ortak bir Keychain kullanabilir mi?

Evet, keychain access groups aracılığıyla. Uygulamaların sağlama profilinde aynı team ID'sine ve aynı keychain-access-groups ile entitlements'a sahip olması gerekir. Geliştirici, Xcode Capabilities'de paylaşımlı erişimi yapılandırır.

Keychain'deki maksimum veri boyutu nedir?

Apple kesin bir sınır belgelemez, ancak pratikte kayıt başına 1–4 KB'ı aşmamak önerilir. Daha büyük hacimler için dosya şifrelemesi kullanın ve anahtarı Keychain'de saklayın, verinin kendisini ise Documents'ta.

Keychain, jailbreak yapılmış bir cihazda güvenli midir?

Jailbreak yapılmış bir cihazda, Keychain koruması azalır çünkü saldırgan root erişimi elde eder ve Keychain SQLite'ını doğrudan okuyabilir. Kritik veriler için sunucudan alınan bir anahtarla ek şifreleme kullanın.

Özet

  • Keychain — AES-256 donanım şifrelemesi ile şifreler, anahtarlar ve sertifikalar için iOS güvenli deposu
  • Security framework C-API sağlar: yazmak için SecItemAdd, okumak için SecItemCopyMatching, silmek için SecItemDelete
  • Keychain veri sınıfları: GenericPassword, InternetPassword, Certificate, Key, Identity — her biri kendi öznitelik kümesine sahip
  • kSecAttrAccessible erişim seviyesini kontrol eder: WhenUnlocked, AfterFirstUnlock, Always, ThisDeviceOnly seçeneğiyle
  • iCloud Keychain kSecAttrSynchronizable özniteliğiyle uçtan uca şifreleme yoluyla cihazlar arasında kayıtları senkronize eder
  • Biyometri (Face ID / Touch ID) kSecAccessControlBiometryCurrentSet aracılığıyla Keychain erişimini korur
  • OAuth token'ları, şifreler ve kriptografik anahtarlar için Keychain kullanın — UserDefaults'ta sır saklamayın

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun