Keychain — mga pangunahing konsepto, arkitektura at kung paano ito gumagana

May-akda: IT Sectr Nai-publish: 2026-03-14 Oras ng pagbabasa: 10 min

Keychain — ay isang secure na imbakan ng mga kredensyal sa iOS, watchOS, macOS at tvOS na namamahala ng mga password, key at certificate sa antas ng hardware. Hindi tulad ng UserDefaults, ang data sa Keychain ay naka-encrypt at nakahiwalay ng sandbox ng application. Ayon sa Apple Developer Documentation, ginagamit ng Keychain ang mga mekanismo ng Secure Enclave at hardware encryption na AES-256 upang protektahan ang kumpidensyal na impormasyon.

Mga pangunahing punto

  • Keychain — imbakan ng system ng iOS para sa mga password, key at certificate na may hardware encryption
  • Security framework ay nagbibigay ng C-function na SecItemAdd, SecItemCopyMatching at SecItemDelete para sa paggamit ng Keychain
  • Ang pag-access sa Keychain ay limitado ng sandbox ng application, ngunit posible ang shared access sa pamamagitan ng keychain access groups
  • Ang atributong kSecAttrAccessible ay tumutukoy sa antas ng proteksyon: mula Always hanggang WhenUnlockedThisDeviceOnly
  • Keychain ay sumusuporta sa pag-iimbak ng mga password, simetriko at asimetrikong key, X.509 certificate

Ano ang Keychain?

Keychain — ay isang secure na database ng operating system ng Apple, na idinisenyo para sa ligtas na pag-iimbak ng mga password, cryptographic key, certificate at iba pang kumpidensyal na data. Unang lumitaw ang Keychain sa Mac OS 8.6 noong 1999, at sa iOS — mula sa unang bersyon ng SDK.

Kahulugan at layunin

Nalulutas ng Keychain ang pangunahing problema ng mobile development: ang pag-iimbak ng mga lihim (token, password, encryption key) sa hindi secure na file system. Hindi tulad ng UserDefaults o SQLite, ang data sa Keychain ay naka-imbak sa naka-encrypt na anyo at awtomatikong naka-encrypt kapag isinulat sa disk.

Ang bawat iOS application ay gumagana sa isang isolated na sandbox at may access lamang sa sarili nitong keychain. Gayunpaman, maaaring i-configure ng developer ang shared access sa Keychain sa pagitan ng mga application ng parehong developer sa pamamagitan ng keychain access groups. Ang gumagamit ng iCloud Keychain ay nagsi-sync din ng data sa pagitan ng mga device sa pamamagitan ng end-to-end encryption.

Ayon sa Apple Security White Paper (2025), gumagamit ang Keychain ng hardware encryption na AES-256 na may key na nakatali sa unique device identifier (UID), na ginagawang hindi ma-access ang data kapag nakuha mula sa device.

Paano gumagana ang Keychain sa iOS?

Ang Keychain ay gumagana bilang isang layered service: ang application ay tumatawag sa Security framework, na nakikipag-ugnayan sa securityd daemon, na namamahala sa naka-encrypt na SQLite database ng Keychain. Ang bawat entry ay naka-encrypt na may hiwalay na key, at ang mga key mismo ay protektado ng hardware module na Secure Enclave sa mga device na may A7 chip at mas bago.

Arkitektura ng Security framework

Ang Security framework ay nagbibigay ng C interface para sa paggamit ng Keychain Services. Mga pangunahing function: SecItemAdd (pagdaragdag), SecItemCopyMatching (paghahanap), SecItemUpdate (pag-update) at SecItemDelete (pagbura). Ang bawat operasyon ay tumatanggap ng diksyunaryo ng mga attribute na CFDictionaryRef na naglalarawan ng uri ng kahilingan.

Ang data ay inuuri ayon sa mga klase: kSecClassGenericPassword (anumang password), kSecClassInternetPassword (password para sa internet service), kSecClassCertificate (certificate), kSecClassKey (cryptographic key) at kSecClassIdentity (kombinasyon ng key at certificate).

Proseso ng pag-iimbak ng data

Kapag nag-iimbak ng password, ang application ay bumubuo ng diksyunaryo na may mga attribute: serbisyo, account, antas ng pag-access, label. Security framework ay nagpapadala ng data sa securityd daemon, na nag-e-encrypt ng entry na may key na nakatali sa device at ini-save sa Keychain SQLite. Ang pagkuha ay nangyayari katulad: kahilingan batay sa mga attribute, paghahanap, pag-decrypt at pagbabalik ng data.

Isang mahalagang feature: kapag binura ang application, awtomatikong nililinis ng iOS ang Keychain mula sa mga entry na ginawa ng application na ito (mula noong iOS 10.3+). Kapag muling na-install ang application, ang Keychain data mula sa nakaraang pag-install ay hindi ma-access, maliban kung ginamit ang iCloud Keychain.

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

Mga uri ng data sa Keychain

Sinusuportahan ng Keychain ang limang pangunahing klase ng data, bawat isa ay may sariling set ng mga attribute at lugar ng aplikasyon. Ang pagpili ng klase ay tumutukoy kung aling mga search key ang available at kung paano naka-encrypt ang data.

Mga password at account

Ang mga klase na kSecClassGenericPassword at kSecClassInternetPassword ay idinisenyo para sa pag-iimbak ng text password. Ang internet na bersyon ay nag-iimbak din ng data ng server: domain, protocol, port at authentication path. Ang GenericPassword ay ginagamit para sa pag-iimbak ng anumang password nang walang pagkakatali sa server.

Kapag nag-iimbak ng internet password, maaaring tukuyin ang kSecAttrServer (domain), kSecAttrProtocol (HTTPS, FTP atbp.), kSecAttrPort at kSecAttrPath. Ito ay nagbibigay-daan sa tumpak na pagkilala ng entry kapag awtomatikong pinupunan sa pamamagitan ng AutoFill.

Cryptographic key at certificate

Ang klase na kSecClassKey ay nag-iimbak ng simetriko (AES) at asimetrikong (RSA, EC) key. Ang klase na kSecClassCertificate — X.509 certificate. Ang klase na kSecClassIdentity ay pinagsasama ang private key at ang kaukulang certificate sa isang entry.

Para sa asimetrikong key, sinusuportahan ng Keychain ang mga attribute: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (kung i-save sa Keychain). Para sa mga certificate: kSecAttrLabel (pangalan na nababasa ng tao), kSecAttrSubject (DN ng may-ari), kSecAttrIssuer (DN ng nagbigay).

Klase ng KeychainLayuninUri ng data
kSecClassGenericPasswordPassword ng applicationData (NSString)
kSecClassInternetPasswordPassword ng serverData + attribute ng server
kSecClassCertificateX.509 certificateSecCertificate
kSecClassKeyCryptographic keySecKey
kSecClassIdentityKey + certificateSecIdentity

Paggamit ng Keychain sa pamamagitan ng API

Ang pangunahing interface para sa pakikipag-ugnayan sa Keychain sa native na iOS code — ang mga function ng Security framework. Para sa Swift at Objective-C, isang C interface ang available, na nakabalot sa mga maginhawang function.

Mga pangunahing operasyon na SecItemAdd at SecItemCopyMatching

Ang function na SecItemAdd ay nagdaragdag ng bagong elemento sa Keychain. Ang input ay tumatanggap ng diksyunaryo na may klase, data at mga attribute. Nagbabalik ng status na errSecSuccess (0) o error code. Ang function na SecItemCopyMatching ay nagsasagawa ng paghahanap batay sa mga attribute at nagbabalik ng nahanap na data.

Para sa paghahanap, ginagamit ang flag na kSecReturnData — kung true, ang function ay nagbabalik ng nilalaman ng entry. Ang flag na kSecMatchLimit ay tumutukoy sa bilang ng mga resulta: kSecMatchLimitOne (isa) o kSecMatchLimitAll (lahat).

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
}

Pagbura at pag-update ng mga entry

SecItemUpdate ay nagbibigay-daan sa pagbabago ng mga attribute o data ng isang umiiral na entry. SecItemDelete ay nagbubura ng lahat ng entry na tumutugma sa ibinigay na diksyunaryo. Kapag nagbubura, mahalagang tukuyin ang sapat na mga attribute upang hindi aksidenteng mabura ang mga entry ng iba sa shared keychain.

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

Mga antas ng pag-access at proteksyon ng data

Ang bawat Keychain entry ay may attribute na kSecAttrAccessible, na tumutukoy kung kailan ang data ay available para sa pagbabasa. Ito ay kritikal para sa seguridad: ang maling antas ng pag-access ay maaaring gawing vulnerable ang data o, sa kabaligtaran, hindi ma-access sa tamang oras.

Mga constant ng availability

kSecAttrAccessibleWhenUnlocked — data ay available lamang kapag ang device ay naka-unlock. kSecAttrAccessibleAfterFirstUnlock — available pagkatapos ng unang pag-unlock pagkatapos ng restart. kSecAttrAccessibleAlways — palaging available (hindi inirerekomenda). Ang postfix na ThisDeviceOnly ay nagbabawal sa paglipat ng data sa pamamagitan ng backup.

Sa mga device na may Secure Enclave, ang encryption key ng Keychain ay maaaring higit pang protektahan ng biometrics: kSecAccessControlBiometryCurrentSet o kSecAccessControlUserPresence. Ito ay nagdaragdag ng kinakailangan ng Face ID o Touch ID para sa bawat operasyon ng pagbasa.

iCloud Keychain at pag-sync

iCloud Keychain ay nagsi-sync ng mga entry sa pagitan ng Apple device sa pamamagitan ng end-to-end encryption. Ang Apple ay walang access sa decrypted data. Upang i-activate ang pag-sync, idagdag ang attribute na kSecAttrSynchronizable na may halagang kCFBooleanTrue.

Mahalaga: ang mga naka-sync na entry ay hindi maaaring maglaman ng attribute na ThisDeviceOnly, dahil dapat silang available sa ibang mga device. Kapag nawala ang lahat ng device, ang iCloud Keychain ay naibabalik sa pamamagitan ng recovery code o iCloud backup key.

Best Practices para sa pagpili ng antas ng pag-access

Para sa mga token ng authentication, gamitin ang kSecAttrAccessibleWhenUnlockedThisDeviceOnly — data ay available lamang sa naka-unlock na device at hindi kinokopya sa backup. Para sa mga certificate na dapat available para sa background tasks, gamitin ang kSecAttrAccessibleAfterFirstUnlock. Huwag kailanman gamitin ang kSecAttrAccessibleAlways para sa kumpidensyal na data.

Inirerekomenda na palaging idagdag ang postfix na ThisDeviceOnly para sa data na hindi nangangailangan ng pag-sync. Ito ay pumipigil sa aksidenteng pagkopya ng mga lihim sa iCloud o iTunes backup, kung saan maaari silang makuha ng mga tool sa pagsusuri. Para sa kritikal na data, pagsamahin ang availability sa kSecAccessControlUserPresence — ito ay nagdaragdag ng kinakailangan ng biometrics o code para sa pag-decrypt ng entry.

Kapag gumagamit ng iCloud Keychain, isaalang-alang na ang mga naka-sync na entry ay available sa lahat ng device ng gumagamit: kung ang isang attacker ay makakuha ng access sa isang device, ang data ay maaaring ma-kompromiso sa lahat. Para sa mga nakahiwalay na lihim, gamitin ang ThisDeviceOnly.

Mga madalas itanong

Paano naiiba ang Keychain sa UserDefaults?

UserDefaults ay nag-iimbak ng data sa bukas na anyo sa .plist file, na accessible sa pagsusuri ng IPA. Keychain ay nag-e-encrypt ng bawat entry nang hiwalay, gumagamit ng hardware encryption at sumusuporta sa mga antas ng pag-access, biometrics at pag-sync sa pamamagitan ng iCloud.

Paano linisin ang Keychain habang nagte-test?

Sa bawat pagpatakbo sa iOS simulator, ang Keychain ay nililinis. Sa tunay na device, burahin ang application — iOS ay magbubura ng lahat ng Keychain entry ng developer na ito. Para sa piling paglilinis, tawagan ang SecItemDelete na may kaukulang mga attribute.

Maaari bang gumamit ang dalawang application ng shared Keychain?

Oo, sa pamamagitan ng keychain access groups. Ang mga application ay dapat magkaroon ng parehong team ID sa lagda at entitlements na may parehong keychain-access-groups. Ang developer ay nagko-configure ng shared access sa Xcode Capabilities.

Ano ang maximum na laki ng data sa Keychain?

Hindi idodokumento ng Apple ang mahigpit na limitasyon, ngunit sa praktika ay inirerekomenda na huwag lumampas ng 1–4 KB bawat entry. Para sa malalaking volume, gumamit ng file encryption at pag-iimbak ng key sa Keychain, at ang data mismo — sa Documents.

Ligtas ba ang Keychain pagkatapos ng jailbreak?

Pagkatapos ng jailbreak, ang proteksyon ng Keychain ay nababawasan, dahil ang attacker ay nakakakuha ng root access at maaaring direktang basahin ang Keychain SQLite. Para sa kritikal na data, gumamit ng karagdagang encryption na may key na nakuha mula sa server.

Buod

  • Keychain — secure na imbakan ng iOS para sa mga password, key at certificate na may hardware encryption na AES-256
  • Security framework ay nagbibigay ng C-API: SecItemAdd para sa pagsulat, SecItemCopyMatching para sa pagbasa, SecItemDelete para sa pagbura
  • Mga klase ng data ng Keychain: GenericPassword, InternetPassword, Certificate, Key, Identity — bawat isa ay may sariling set ng mga attribute
  • kSecAttrAccessible ay namamahala sa antas ng pag-access: WhenUnlocked, AfterFirstUnlock, Always, na may opsyon na ThisDeviceOnly
  • iCloud Keychain ay nagsi-sync ng mga entry sa pagitan ng mga device sa pamamagitan ng end-to-end encryption na may attribute na kSecAttrSynchronizable
  • Biometrics (Face ID / Touch ID) ay nagpoprotekta sa pag-access sa Keychain sa pamamagitan ng kSecAccessControlBiometryCurrentSet
  • Gamitin ang Keychain para sa pag-iimbak ng OAuth tokens, password at cryptographic key — huwag mag-imbak ng mga lihim sa UserDefaults

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din