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, ş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.
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.
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, 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).
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.
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, 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.
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.
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ü |
|---|---|---|
| kSecClassGenericPassword | Uygulama şifresi | Data (NSString) |
| kSecClassInternetPassword | Sunucu şifresi | Data + sunucu öznitelikleri |
| kSecClassCertificate | X.509 sertifikası | SecCertificate |
| kSecClassKey | Kriptografik anahtar | SecKey |
| kSecClassIdentity | Anahtar + sertifika | SecIdentity |
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.
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ü).
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, 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.
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)
}
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.
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, 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.
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
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.
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.
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.
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.
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
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.
Ayrıca okuyun