แนะนําการจัดเก็บข้อมูลแบบปลอดภัยบน OS
ป้องกันข้อมูลผู้ใช้ที่มีความสําคัญ เป็นความรับผิดชอบพื้นฐานของโปรแกรม ISOS ทั่วไป ไม่ว่าคุณจะเก็บค่าลายเซ็น, การเข้ารหัส หรือข้อมูลส่วนตัว,แพลตฟอร์มนี้จะให้คําตอบที่ต้องใช้ฮาร์ดแวร์สํารอง: [FLT: 0] Keychain (FLT: 1). แตกต่างจาก [FTT: 0) หรือรายการทรัพย์สิน, การเข้ารหัสแบบคีย์ชินที่ควบคุมอย่างเข้มงวด บทความนี้จะให้คําแนะนําเกี่ยวกับการใช้งานข้อมูลที่ปลอดภัยในการจัดเก็บข้อมูล, การครอบคลุมระบบความปลอดภัยและการใช้งานที่ดีที่สุด
การ เข้าใจ คีย์ OS
Keychain เป็นกล่องจัดเก็บข้อมูลที่ปลอดภัย ซึ่งจัดการโดยระบบปฏิบัติการ ซึ่งจะบรรจุรายการขนาดเล็ก, มีความสําคัญต่าง ๆ เช่น รหัสผ่าน, ปุ่มพิมพ์การเข้ารหัส, หรือใบรับรอง -- ในฐานข้อมูลที่ถูกเข้ารหัสไว้ ข้อมูลที่ถูกเขียนไปยังคีย์จีนได้ถูกป้องกันไว้ แม้ว่าอุปกรณ์จะถูกล็อคเอาไว้แล้วก็ตาม
- [FLT: 0] การเข้ารหัสที่ท่า ส่วนที่เหลือ ใช้อุปกรณ์สํารอง เอเอส-256.
- [FLT: 0] access Control ผ่านอุปกรณ์ผ่านรหัส, ID หรือ ID ของใบหน้า (PDF).
- [FLT: 0] การข้ามแอพซ้ํา [[FLT: 1] (หากปรับแต่ง) และตัวเลือกเพิ่มเติมการจับคู่ (Clouding).
- [FLT: 0] การจําแนก ระหว่างแอพ: โดยปริยายแล้ว โปรแกรมหนึ่งไม่สามารถอ่านรายการคีย์ชินของแอปอีกอันได้ นอกจากจะแบ่งปันกลุ่มคีย์ชินร่วมกัน
Keychain ไม่ได้ถูกออกแบบมาสําหรับก้อนใหญ่; เก็บแต่ละรายการไว้ภายใต้ไม่กี่กิโลไบต์ สําหรับข้อมูลขนาดใหญ่ ให้พิจารณาใช้ [FLT: 1) API หรือ แบบการเข้ารหัสแบบแฟ้ม
บริการคีย์ชิน API vs. ห้องสมุดสามส่วน
Apple ให้ข้อมูลพื้นเมือง [FLT: 0] Keychin Serviews [FLT: 1) API (CI-belp:3] ซึ่งทรงพลังแต่ใช้คํากริยา คุณสามารถใช้มันโดยตรง หรือรับเอาไลบรารีแบบไวฟต์-จารงค์แบบนิยมแบบ สืบค้นเมื่อเทียบกับระบบควบคุมระบบใช้งานของเอพีทีซีเอ
ตั้งค่าคลังกุญแจ
ก่อนจะจัดเก็บสิ่งใด ๆ คุณต้องตัดสินใจเกี่ยวกับ [FLT: 0] คลาสรายการ (FLT: 1) [FLT: 1] ซึ่งโดยทั่วไปแล้วคือ [FT: 4] สําหรับรหัสผ่านหรือใบรับรองอินเทอร์เน็ต จะมีคลาสอื่น ๆ แต่ละรายการมีการอ้างอิงถึงด้วยชุดของคุณลักษณะ -- Aพจนานุกรม (CFDDIRIIIIIIIIIIIIIT) ที่อธิบายรายการนี้
การไหลพื้นฐานตามรูปแบบนี้เสมอ
- สร้างพจนานุกรมสําหรับสอบถามโดยใช้คลาสรายการและคุณสมบัติต่าง ๆ
- เรียกฟังก์ชันที่เหมาะสม [FLT: 5] ([FLT: 6]] [[FLT: 7]]] [FLT: 8]]] [FLT: 8]].
- Check resent [[FLT: 10]] ([[FLT: 11] หรือรหัสข้อผิดพลาด).
ก่อนทําการเขียนโค้ด ให้นําเข้าโมดูลความปลอดภัย:
import Security
import Foundation // for Data and String utilities
การ ขโมย ข้อมูล ใน แผง คีย์
กําลังเขียนรหัสผ่านทั่วไป
เพื่อบันทึกเครื่องหมาย (เช่น, JWT) สําหรับผู้ใช้ปัจจุบัน:
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
}
จุดสําคัญ:
- [FLT: 14] ทําเป็นกุญแจหลัก เลือกข้อความเฉพาะ (เช่น หมายเลขผู้ใช้ หรือค่าคงที่ เช่น [FLT: 15].
- [FLT: 16] ควบคุมเมื่อรายการสามารถอ่านได้ ใช้ [FLT: 17] เพื่อรักษาความปลอดภัยที่ดีที่สุด; มันป้องกันการสํารองข้อมูล ICloud และจํากัดการเข้าถึงอุปกรณ์ปัจจุบัน
- เราเรียก ก่อนเพิ่มเพื่อหลีกเลี่ยงการสะสมของซ้ํา ทางเลือกอื่นคือ คุณสามารถใช้.
เพิ่มการควบคุมการเข้าใช้ (ไบอมรี หรือ พาสโค้ด)
สําหรับข้อมูลที่ละเอียดอ่อนสูง ต้องการหมายเลขสัมผัสหรือหมายเลขใบหน้า ก่อนที่จะอ่าน:
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)
ขณะนี้ [FLT: 21] เรียกรายการนี้ จะจุดชนวนระบบชีวมิติหรือรหัสผ่าน ใช้ [FLT: 22] จากท้องถิ่น AUTAATIII เพื่อจัดการการปฏิสัมพันธ์ของผู้ใช้อย่างราบรื่น
กําลังรับข้อมูลจากคีย์ชิน
เพื่ออ่านตั๋วที่เก็บไว้:
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
}
ตั้งค่า [FLT: 24] ไปยัง [FLT: 25] เพื่อเอาข้อมูลกลับมา ใช้ เพื่อรับผลหนึ่ง ถ้าคุณเลื่อนค่าไปเกิน API อาจคืนข้อมูลไป
[FLT: 0] Impriant: เมื่อใช้การควบคุม (biomerit) [FLT: 27] การโทรอาจกลับมา [FLT: 28] หากผู้ใช้ยกเลิก จัดการกับคดีนี้แยกออกจากกัน และไม่ถอยกลับไปที่ จัดเก็บข้อความธรรมดา
ปรับปรุงและลบรายการคีย์จีน
ปรับปรุงรายการที่มีอยู่แล้ว
แทนที่จะลบและปรับใหม่ ให้ใช้ [FLT: 29]:
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
}
นี่มีประสิทธิภาพมากกว่าการลบ+++++ และสามารถหลีกเลี่ยงเงื่อนไขการเชื้อชาติที่มีศักยภาพ
ลบรายการ
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
}
ระวังในการลบรายการที่เป็นของโปรแกรมอื่น ๆ ที่ใช้ร่วมกันในกลุ่มที่เข้าใช้ร่วมกัน -- มักจะจัดขอบเขตการค้นหาของคุณด้วย หากคุณใช้คีย์ชินร่วมกัน
แอตทริบิวต์ควบคุมการเข้าใช้และช่วยใช้งาน
ค่าคงที่ กําหนด [FLT: 0] เมื่อ[FLT: 1) รายการคีย์ชินสามารถอ่านได้ เลือกตัวเลือกที่เข้มงวดที่สุดที่ยังตรงกับความต้องการของแอพ:
| 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. |
สําหรับโปรแกรมส่วนใหญ่แล้ว จะกระทบกับสมดุลของความปลอดภัยและการใช้งานได้อย่างถูกต้อง หากคุณต้องการอ่านรายการต่าง ๆ ในพื้นหลัง (เช่น สัญญาณรีเฟรชของ parts) คุณต้องใช้[FLT: 40] (และยอมรับข้อมูลที่มีการป้องกันน้อยไปเล็กน้อย)
การ จัด การ ผิด พลาด และ หลุม พราง ทั่ว ไป
ฟังก์ชันกลับ [FLT: 42]. ตรวจดูและจัดการความล้มเหลวที่เหมาะสม. ความผิดพลาดทั่วไป:
- (1-2300) - ไม่มีของตรงกับคําสอบถาม
- (-125299) – รายการที่มีคีย์หลักเดียวกันนี้มีอยู่แล้ว (ถ้าคุณยังไม่ได้ลบก่อน).
- (1-28) – ผู้ใช้ยกเลิกระบบชีวเมตร
- (1-225293) – การตรวจสอบสิทธิ์ล้มเหลวหรือ ไบโอเมตริกยังไม่มีอยู่
ไม่ต้องละเลยสถานะที่ไม่ใช่การตรวจสอบ กรุณาลดความเสื่อมทราม: แสดงข้อความผิดพลาดหรือพยายามอีกครั้ง แต่ห้ามเก็บข้อมูลที่มีความสําคัญนอกคีย์ชินเป็นความล้มเหลว คุณสามารถใช้ [FLT: 47] เพื่อตรวจสอบความสมบูรณ์ของไบโอเมตริกซ์ก่อนที่จะพยายามเข้าใช้
การ ปฏิบัติ อย่าง ดี ที่ สุด และ การ พิจารณา อย่าง ละเอียด ถี่ถ้วน
- [FLT: 0] ใช้ชื่อบัญชีที่มีลักษณะเฉพาะ ต่อผู้ใช้หรือต่อรายการเพื่อหลีกเลี่ยงการชนกัน
- [FLT: 0] ระบุคุณสมบัติการเข้าใช้ [FLT: 1] ไม่เช่นนั้น ระบบปริยาย ( จะใช้ ซึ่งอาจจะไม่เป็นอุดมคติ
- [FLT: 0] ถอดรหัสข้อมูลคีย์ชินเมื่อผู้ใช้ทําการล็อกอินออก [[FLT: 1) -- จัดเรียงบัญชีทั้งหมดที่ทราบและลบรายการ
- [FLT: 0] ใช้ Access Keychain Groups[FLT: 1) เฉพาะเมื่อแบ่งปันระหว่างแอพของคุณเองเท่านั้น หลีกเลี่ยงวงกว้าง (FLT: 1).
- [FLT: 0] ห้ามเก็บข้อมูลที่ไม่ไวต่อความรู้สึก (เช่นผู้ใช้: value) ในคีย์ชิน -- ใช้ หรือฐานข้อมูลแทน
- [FLT: 0] พิจารณาการใช้ กับ สําหรับสถานการณ์ขั้นสูง (MacOS Katalist).
- [FLT: 0]. STST ลงบนอุปกรณ์จริง; ตัวจําลองใช้ซอฟต์แวร์คีย์ชินที่ประพฤติตัวต่างไปจากคลังฮาร์ดแวร์
ใช้คีย์ชินกับสวิฟต์ยูไอและแอสย็อง/อารอว์
สําหรับโปรแกรมสมัยใหม่ การจัดการคีย์ชินแบบห่อ (keychain) ในนักแสดง หรือคลาสที่ป้องกันการปิดกั้นการปิดกั้นการถูกปิดกั้น
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)
}
}
ถ้าคุณใช้ไบโอเมตริก อาจปิดกั้นเธรดในระหว่างรอการปฏิสัมพันธ์ ผู้ใช้ ห่อมันในคิวหลัง หรือดีกว่า ใช้ วิธี [FT:56] ก่อนการโทรคีย์ชิน
รูปแบบการวน
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.