Sibil & Inhinyeriyang Pampasabog
Pag - aalis ng Katiwasayan sa Data Storage na may Keychain sa Ios
Table of Contents
Pagpapakilala sa Ligtas na Data sa iOS
Ang pag-iingat ng sensitibong datos ng gumagamit ay isang pundamental na pananagutan ng anumang aplikasyon ng iOS.[T]Keychain[ Ang plataporma ay nagbibigay ng isang dedikadong hardware-backed solution: ang Keychain[. Ang artikulong ito ay nagbibigay ng komprehensibong gabay upang ipatupad ang mga impormasyong pang-internasyonal na mga sanggunian, ang mga talaksang pang-ekonomikswal na pang-ekonomisyon, ang mga sangguniang pang-kalikasang pang-kalikasang pang-kalikasan at pang-kalikasang pang-kalikasang pang-kalikasang pang-kalikasang pang-kalikasang pang-kalikasang pang-eksig pang-kalikasang pang-kalikasang pang-kalikasan.
Pag - unawa sa iOS Keychain
Ang Keychain ay isang ligtas na imbakang sisidlan na pinangangasiwaan ng operating system.Nag-iimbak ito ng maliliit at sensitibong mga bagay na tulad ng password, cryptographic key, o sertipiko ⁇ in isang encrypted database. Data na nakasulat sa Keychain ay protektado kahit na naka-lock ang aparato. Ang mga kakayahan ng susi ay kinabibilangan ng:
- [Encryption sa pahinga gamit ang hardware-backed AES-256.
- Ang kontrol ng Acceses sa pamamagitan ng device pascode, Touch ID, o Face ID.
- Ang pag-iwas sa app ay muling nag-iluklok[ (kung isasaayos) at opsyonal na iCloud synclading.
- sa pagitan ng mga app: sa pamamagitan ng default, ang isang app ay hindi maaaring magbasa ng isa pang appiences Keychain na mga bagay maliban na lamang kung sila ay magkasama sa isang Keychain access group.
Ang Keychain ay hindi dinisenyo para sa malalaking blob; ingatan ang bawat bagay sa ilalim ng ilang kilobyte. para sa mas malaking datos, isaalang-alang ang paggamit ng API o ang frameing kasama ang file-based encryption.
Mga Serbisyong Keychain API vs. Third-Party Libraries
Ang Apple ay nagbibigay ng katutubong Keychain Services[ API (C-based, ), na makapangyarihan ngunit pandiwang-anyo. Maaari mo itong gamitin nang tuwiran, o mag-ampon ng isang Swift-friendly staple.[[[T] Ang mga ikatlong-partido na aklatan tulad ngKeychainces o kaya ay ang mga kilalang ikatlong-partwiey na mga aklatan tulad ng [[T][T] Ang mga patakarang under-infincancepwer'tpwer ay ang mga patakarang pang-incanculat sa pag-incancepwer't.[T][T][T] ay ang mga patakarangopwer'tpwer't.[T][T].[T] Ang [[T] ay mahalaga sa infopppwerppppppwerpwerpwerpwerpwer'tpppppppp
Paglalagay ng Tyklain Storage
Bago mag-imbak ng kahit anong bagay, dapat kang magpasiya sa Keychain stain class[. Ang pinaka-karaniwan sa mga veneric password ay . para sa mga password o sertipiko sa Internet, may iba pang mga klase. Ang bawat bagay ay tinutukoy ng isang set ng mga katangiang identikal na ⁇ (CFDictionary) na naglalarawan sa item.
Ang pangunahing daloy ay laging sumusunod sa ganitong parisan:
- Gumawa ng diksyunaryo ng mga tanong na may ganitong klase at mga katangian.
- Tawagin ang angkop na tungkulin (, , , ).
- Tingnan ang ibinalik ( o ang kodigo ng kamalian).
Bago sumulat ng kodigo, mag - angkat ng Security module:
import Security
import Foundation // for Data and String utilities
Pag - iimbak ng Data sa Keychain
Pagsulat ng isang Generic Password
Upang makatipid ng isang token (hal., isang JWT) para sa kasalukuyang gumagamit:
func saveToken(_ token: String, forAccount account: String) -> Bool {
guard let tokenData = token.data(using: .utf8) else { return false }
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: tokenData,
// Optional: restrict access to when device is unlocked
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
// Delete any existing item first to avoid duplicates
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
return status == errSecSuccess
}
Mga susing punto:
- ay gumaganap bilang isang pangunahing susi; pumili ng isang natatanging strando (e.g., ang gumagamit na ID o isang hindi nagbabagong katulad ).
- ang kontrol kapag ang bagay ay mababasa. Gamitin para sa pinakamahusay na seguridad; hinahadlangan nito ang iCloud backup at pinipigilan ang pagpasok sa kasalukuyang aparato.
- Tinatawag natin bago idagdag upang maiwasan ang pagtitipon ng mga bagay na katulad nito. alternatibo, maaari mong gamitin .
Pagdaragdag ng Pagpigil sa Pag-aalsa (Biometry o Passcode)
Para sa lubhang sensitibong impormasyon, kailangan ng Touch ID o Face ID bago basahin:
let accessControl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.userPresence, // requires passcode, Face ID, or Touch ID
nil
)
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account,
kSecValueData as String: tokenData,
kSecAttrAccessControl as String: accessControl as Any
]
SecItemAdd(query as CFDictionary, nil)
Ngayon ang anumang na tawag sa bagay na ito ay mag-uudyok ng isang biometric o pascode quish. Gamitin mula sa LocalAuthentication upang maging maganda ang pakikitungo sa gumagamit.
Pag - aalis ng Data mula sa Keychain
Upang basahin ang nakaimbak na patlang:
func retrieveToken(forAccount account: String) -> String? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
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,
let data = item as? Data,
let token = String(data: data, encoding: .utf8) else {
return nil
}
return token
}
Itakda sa upang makuha pabalik ang datos. Gamitin upang makuha ang isang resulta. kung hindi mo ito limitin, ang API ay maaaring bumalik sa isang array.
[ISportant: Kapag gumagamit ng contracept control (biometry), ang tawag ay maaaring bumalik kung ang gumagamit ay magkansela. Gamitin nang hiwalay ang kasong ito at huwag kailanman mahulog sa payak na imbakan ng teksto.
Pag - aayos at Pag - aalis ng mga Keychain Item
Pag - unawa sa Isang Umiiral na Bagay
Sa halip na mag-alis at mag-readding, gamitin ang :
func updateToken(_ newToken: String, forAccount account: String) -> Bool {
guard let newData = newToken.data(using: .utf8) else { return false }
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account
]
let attributesToUpdate: [String: Any] = [
kSecValueData as String: newData
]
let status = SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)
return status == errSecSuccess
}
Ito ay mas mahusay kaysa sa delete+add, at iniiwasan nito ang mga potensiyal na kalagayan ng lahi.
Pag - aalis ng Isang Bagay
func deleteItem(forAccount account: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: account
]
let status = SecItemDelete(query as CFDictionary)
return status == errSecSuccess
}
Ingatang huwag idiskarga ang mga bagay na pag - aari ng ibang app na may iisang akses na pang - groupifict (isang uri ng tubo) na laging kasama kung gagamit kayo ng magkasamang Keychains.
Mga Attribusyon ng Access at Access Access
Ang [1] kapag ay maaaring basahin ang bagay na Keychain. Piliin ang pinakamahigpit na opsiyon na nakatutugon pa rin sa iyong mga pangangailangan sa appichos:
| Attribute | Meaning |
|---|---|
kSecAttrAccessibleWhenUnlocked | Available only while device is unlocked (default). |
kSecAttrAccessibleAfterFirstUnlock | Available after device boots and is unlocked once. Allows background access. |
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly | Requires a passcode to be set. Strictest option—prevents access even after unlock if passcode is removed. |
kSecAttrAccessibleWhenUnlockedThisDeviceOnly | Same as WhenUnlocked but does not back up to iCloud, and cannot be restored to another device. |
Para sa karamihan ng mga app, ang tamang balanse sa pagitan ng seguridad at pagiging madaling gamitin.[kailangan mong basahin ang mga bagay sa likuran (hal., isang panariwa ng likuran), dapat mong gamitin (at tanggapin na ang datos ay medyo hindi protektado).
Error sa Paglutas at Karaniwang mga Patibong
Ang mga tungkulin ay nagpapanumbalik ng . Laging suriin ito at pangasiwaan ang mga kabiguan nang angkop.
- (–25300) – Walang bagay na tumutugma sa query.
- (–25299) – Isang bagay na may parehong pangunahing susi ang umiiral na (kung ikaw ay unang nag-debut ng ⁇ ).
- (–128) – User na kinakansela ang biyometric leader.
- (–25293) – nabigo ang rekombinasyon o hindi makukuha ang biometrikong mga bagay.
Huwag ipagwalang-bahala ang katayuang hindi matagumpay.Ale-fluous na pagbaba: magpakita ng maling mensahe o muling pag-iintry, ngunit huwag kailanman mag-imbak ng sensitibong datos sa labas ng Keychain bilang isang fallback. magagamit mo upang suriin ang biometrikong makukuha bago sumubok na access.
Pinakamabuting mga Gawain at mga Pag - aasikaso sa Produksiyon
- Use noble, naglalarawang account names kada user o bawat uri ng bagay upang maiwasan ang mga banggaan.
- Palaging magtakda ng isang accessableity attribute; kung hindi, ang sistemang default () ay kumakapit, na maaaring hindi uliran.
- Clear Keychain data kapag ang gumagamit ay nag-ebolb ng[update sa lahat ng alam na account at delete na mga bagay.
- Use Keychain Access Groups lamang kapag nakikibahagi sa pagitan ng iyong sariling mga app. Iwasan ang mga malalaking grupo.
- Huwag kailanman mag-imbak ng non-sensitive data[ (katulad ng mga kagustuhan ng gumagamit) sa Keychaini ⁇ use o sa halip ay database.
- Mga pagsasaalang-alang gamit ang na may [ para sa mga advanced scene (macoS Catalyst).
- [[T] Pinaka-"St sa isang tunay na aparato; ang Simulator ay gumagamit ng isang software na Keychain na nag-aasal na naiiba sa hardware-backed na imbakan.
Paggamit ng Keychain kasama ng SwiftUI at Async/Await
Para sa mga modernong app, balutin ang mga operasyong Keychain sa isang aktor o async-ligtas na klase upang maiwasan ang pagharang sa pangunahing sinulid. Halimbawa gamit ang :
actor KeychainManager {
func saveToken(_ token: String, for account: String) async -> Bool {
// same implementation as above, but now it's safe to call from any context
return saveToken(token, forAccount: account)
}
}
Kung gagamit ka ng biometrics, ang tawag ay maaaring humadlang sa sinulid habang hinihintay ang interaksiyon ng gumagamit. Wrapin ito sa isang background queue, o mas mabuti, gamitin method bago ang Keychain call.
Pagsasaayos
The iOS Keychain is the correct place to store small, sensitive pieces of data. By using the native Keychain Services API, you gain direct control over encryption, accessibility, and authentication policies. Always pair your Keychain usage with solid error handling and remember to clear data when appropriate. For further reading, refer to the Apple Keychain Service Documentation and the Keychain Concepts overview. Adopting these practices will help you ship iOS apps that respect user privacy and withstand security scrutiny.