Swift Academy · Ders

Gizli Bilgileri Keychain'de Saklama

Kimlik bilgilerini güvenle kaydedin ve alın.

1. ders / 413 adım

Gizli Bilgileri Keychain'de Saklama, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.

Anahtar Zinciri Neden Kullanılır

Parolalar, belirteçler ve anahtarlar UserDefaults ya da düz dosyalarda asla tutulmamalıdır — bunların okunması kolaydır. Anahtar Zinciri, küçük gizli bilgiler için donanım ve kullanıcının parolasıyla korunan, işletim sistemi tarafından yönetilen şifreli bir veritabanıdır. Kimlik bilgileri için doğru tek yer burasıdır.

import Security
// Keychain stores secrets encrypted at rest,
// survives app updates, and gates access by policy.

Ögeler Sözlüklerden Oluşur

Keychain Services API'si C tabanlıdır: bir ögeyi, kSec... sabit anahtarlarını kullanan bir [String: Any] sorgu sözlüğüyle tanımlarsınız. Aynı sözlük biçimi ekleme, arama, güncelleme ve silme işlemlerinde yeniden kullanılır.

import Security
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "user@example.com",
    kSecAttrService as String: "com.example.app"
]
_ = query

Öge Sınıfları

kSecClass anahtarı öge türünü seçer. kSecClassGenericPassword, uygulama belirteçlerini ve gizli bilgileri kapsar; kSecClassInternetPassword ise sunucu kimlik bilgilerini ana bilgisayar/protokol öznitelikleriyle depolar. Çoğu uygulama gizli bilgisi genel parola türünü kullanır.

import Security
// kSecClassGenericPassword   -> tokens, API keys
// kSecClassInternetPassword  -> server logins
// kSecClassKey / Certificate -> crypto material
let cls = kSecClassGenericPassword
_ = cls

Öge Ekleme

SecItemAdd yeni bir öge ekler. Veriyi Data olarak kSecValueData altında ve ögeyi tanımlayan özniteliklerle birlikte belirtirsiniz. Bir OSStatus döndürür — errSecSuccess işlemin başarılı olduğu anlamına gelir.

import Security
func save(_ token: String, account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecValueData as String: Data(token.utf8)
    ]
    return SecItemAdd(query as CFDictionary, nil)
        == errSecSuccess
}

Yinelenen Ögeleri İşleme

Tanımlayıcı öznitelikleri zaten var olan bir ögeyi eklemek errSecDuplicateItem döndürür. Sağlam bir kaydetme işlemi SecItemAdd ile dener; yinelenen öge durumunda SecItemUpdate için yedek seçeneğe geçer — bu bir upsert düzenidir.

import Security
func upsert(_ data: Data, account: String) -> Bool {
    let base: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account]
    var add = base
    add[kSecValueData as String] = data
    let status = SecItemAdd(add as CFDictionary, nil)
    if status == errSecDuplicateItem {
        return SecItemUpdate(base as CFDictionary,
            [kSecValueData as String: data] as CFDictionary)
            == errSecSuccess
    }
    return status == errSecSuccess
}

Bir Öğeyi Geri Okuma

SecItemCopyMatching arama yapar. Gizli baytları almak için kSecReturnData değerini true olarak ve kSecMatchLimit değerini kSecMatchLimitOne olarak ayarlamanız gerekir. Sonuç, CFTypeRef türünde bir çıktı parametresi üzerinden döner.

import Security
func load(account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne]
    var result: CFTypeRef?
    let status = SecItemCopyMatching(
        query as CFDictionary, &result)
    guard status == errSecSuccess else { return nil }
    return result as? Data
}

Bir Öğeyi Güncelleme

SecItemUpdate iki sözlük alır: öğeyi bulan bir sorgu ve güncellenecek öznitelikleri içeren bir sözlük. Yalnızca listelediğiniz öznitelikler değişir; diğer her şey korunur.

import Security
func update(_ newData: Data, account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account]
    let attrs: [String: Any] = [
        kSecValueData as String: newData]
    return SecItemUpdate(query as CFDictionary,
        attrs as CFDictionary) == errSecSuccess
}

Bir Öğeyi Silme

SecItemDelete eşleşen öğeleri kaldırır. Var olmayan bir şeyi silmek, oturum kapatılırken kimlik bilgilerini temizleme işleminde başarı olarak değerlendirebileceğiniz errSecItemNotFound sonucunu döndürür.

import Security
func delete(account: String) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account]
    let status = SecItemDelete(query as CFDictionary)
    return status == errSecSuccess
        || status == errSecItemNotFound
}

OSStatus Kodlarını Açıklama

Hatalar, tamsayı türünde OSStatus kodlarıdır. SecCopyErrorMessageString bu kodlardan birini insanların okuyabileceği bir açıklamaya dönüştürür; bu, kaydetme veya okuma işleminin neden başarısız olduğunu ayıklarken son derece değerlidir.

import Security
func describe(_ status: OSStatus) -> String {
    return SecCopyErrorMessageString(status, nil)
        as String? ?? "OSStatus \(status)"
}

Öğeleri Benzersiz Biçimde Tanımlama

Öğeler, özniteliklerinin birleşimine göre eşleştirilir; genel parolalar için genellikle kSecAttrService ile kSecAttrAccount kullanılır. Farklı gizli bilgilerin birbiriyle çakışmaması için kararlı ve uygulamaya özel bir hizmet dizesi seçin.

import Security
// Uniqueness for generic passwords usually comes from:
//   service (your bundle id) + account (the username)
let service = "com.example.app.auth"
let account = "current-user"
_ = (service, account)

Küçük Bir Sarmalayıcı

Ham API ayrıntılı olduğundan ekipler bunu save, read ve delete işlevlerini dışarı sunan küçük bir türe sarar. Böylece kSec kullanım ayrıntıları tek bir yerde tutulur ve çağrı noktaları temiz kalır.

import Security
struct TokenStore {
    let service = "com.example.app.auth"
    func read(_ account: String) -> Data? {
        let q: [String: Any] = [
            kSecClass as String: kSecClassGenericPassword,
            kSecAttrService as String: service,
            kSecAttrAccount as String: account,
            kSecReturnData as String: true,
            kSecMatchLimit as String: kSecMatchLimitOne]
        var out: CFTypeRef?
        return SecItemCopyMatching(q as CFDictionary, &out)
            == errSecSuccess ? out as? Data : nil
    }
}

Hızlı Kontrol

Kaydedilmiş bir gizli bilginin baytlarını almanın doğru yolunu hatırlayın.

Özet

Anahtar Zinciri'nde oluşturma, okuma, güncelleme ve silme işlemlerini öğrendiniz:

  • Kimlik bilgilerini şifrelenmiş Anahtar Zinciri'nde saklayın; bunları asla UserDefaults'ta veya dosyalarda saklamayın.
  • Öğeleri kSec sorgu sözlükleriyle tanımlayın; kSecClassGenericPassword gibi bir sınıf seçin.
  • SecItemAdd / SecItemCopyMatching / SecItemUpdate / SecItemDelete yaşam döngüsünün tamamını kapsar; errSecDuplicateItem durumunu ekleyip güncelleme işlemiyle yönetin.
  • Öğeleri hizmet ve hesapla tanımlayın, hata ayıklama için OSStatus değerlerini açıklayın.
Başlamak ücretsiz

Yapay zeka eğitmeniyle Swift öğren — ücretsiz

Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.

Kurslar
122
Dersler
409

Sıkça Sorulan Sorular

“Gizli Bilgileri Keychain'de Saklama” dersi ücretsiz mi?

Evet — “Gizli Bilgileri Keychain'de Saklama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.

“Gizli Bilgileri Keychain'de Saklama” dersinde ne öğreneceğim?

Kimlik bilgilerini güvenle kaydedin ve alın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Swift Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Gizli Bilgileri Keychain'de Saklama” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Gizli Bilgileri Keychain'de Saklama
  2. Keychain Erişim Denetimi
  3. Biyometrik Kimlik Doğrulama
  4. Veri Koruma ve Şifreleme
← Swift Academy Sayfasına Dön