0Pricing
Swift Academy · บทเรียน

การควบคุมการเข้าถึง Keychain

จำกัดการเข้าถึงรายการด้วยไบโอเมตริกซ์และการปลดล็อกอุปกรณ์

การควบคุมการเข้าถึง Keychain เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

การควบคุมเวลาที่อ่านข้อมูลลับได้

การจัดเก็บข้อมูลลับเป็นเพียงครึ่งหนึ่งของงานเท่านั้น — คุณต้องควบคุมด้วยว่า เมื่อใดจึงจะอ่านข้อมูลนั้นได้ พวงกุญแจมีคลาสการเข้าถึงและแฟล็กควบคุมการเข้าถึงที่จำกัดรายการไว้เบื้องหลังการปลดล็อกอุปกรณ์ รหัสผ่าน หรือไบโอเมตริกซ์ ซึ่งช่วยปกป้องข้อมูลหากอุปกรณ์สูญหาย

import Security
// Two layers of control:
//   kSecAttrAccessible  -> when readable (lock state)
//   SecAccessControl    -> user presence / biometrics

คีย์ kSecAttrAccessible

kSecAttrAccessible กำหนดคลาสการเข้าถึงขณะเพิ่มรายการ โดยกำหนดว่ารายการจะพร้อมใช้งานตลอดเวลา เฉพาะหลังการปลดล็อกครั้งแรก หรือเฉพาะขณะที่อุปกรณ์ปลดล็อกอยู่ เลือกระดับที่เข้มงวดที่สุดเท่าที่ฟีเจอร์ของคุณรองรับ

import Security
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "user",
    kSecValueData as String: Data("secret".utf8),
    kSecAttrAccessible as String:
        kSecAttrAccessibleWhenUnlocked
]
_ = query

WhenUnlocked

kSecAttrAccessibleWhenUnlocked ทำให้รายการอ่านได้เฉพาะขณะที่อุปกรณ์ปลดล็อกอยู่ งานเบื้องหลังที่ทำงานขณะอุปกรณ์ล็อกจะเข้าถึงรายการนี้ไม่ได้ นี่เป็นค่าเริ่มต้นที่เหมาะสมสำหรับโทเค็นเซสชันส่วนใหญ่

import Security
// Readable only while unlocked; blocked when locked.
let level = kSecAttrAccessibleWhenUnlocked
_ = level

AfterFirstUnlock

kSecAttrAccessibleAfterFirstUnlock ทำให้รายการอ่านได้ตั้งแต่การปลดล็อกครั้งแรกหลังเปิดเครื่องไปจนถึงการรีบูตครั้งถัดไป แม้หลังจากนั้นอุปกรณ์จะถูกล็อกอยู่ก็ตาม ใช้กับข้อมูลลับที่กระบวนการเบื้องหลังจำเป็นต้องใช้ เช่น โทเค็นสำหรับจัดการการแจ้งเตือนแบบพุช

import Security
// Available after the first unlock post-boot,
// including while subsequently locked.
let level = kSecAttrAccessibleAfterFirstUnlock
_ = level

ตัวแปร ThisDeviceOnly

คลาสการเข้าถึงแต่ละคลาสมีรูปแบบ ...ThisDeviceOnly รายการเหล่านี้จะไม่รวมอยู่ในข้อมูลสำรองที่เข้ารหัส และจะไม่ย้ายไปยังอุปกรณ์เครื่องใหม่ ใช้กับคีย์ที่ไม่ควรออกจากฮาร์ดแวร์เครื่องนี้โดยเด็ดขาด

import Security
// Never backed up, never migrated:
let local = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
_ = local

เมื่อมีการตั้งรหัสผ่าน

kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly จะจัดเก็บรายการก็ต่อเมื่อผู้ใช้ตั้งรหัสผ่านไว้ และจะลบรายการหากผู้ใช้ลบรหัสผ่าน รับประกันว่าข้อมูลลับจะได้รับการปกป้องด้วยรหัสผ่านเสมอ

import Security
let level =
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
// Item vanishes if the user disables their passcode.
_ = level

SecAccessControl สำหรับการยืนยันตัวตนของผู้ใช้

นอกเหนือจากสถานะการล็อกแล้ว SecAccessControlCreateWithFlags ยังสร้างนโยบายที่กำหนดให้ผู้ใช้ต้องยืนยันตัวตนในขณะนั้น ไม่ว่าจะด้วยไบโอเมตริกซ์หรือรหัสผ่าน ขณะอ่านข้อมูล คุณแนบนโยบายนี้ผ่าน kSecAttrAccessControl แทนคีย์การเข้าถึง หรือใช้ร่วมกับคีย์ดังกล่าวก็ได้

import Security
func makeControl() -> SecAccessControl? {
    return SecAccessControlCreateWithFlags(
        nil,
        kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
        .userPresence,
        nil)
}

แฟล็กควบคุมการเข้าถึง

แฟล็กช่วยกำหนดข้อกำหนดให้ละเอียดขึ้น: .userPresence อนุญาตให้ใช้ไบโอเมตริกซ์หรือใช้รหัสผ่านเป็นทางเลือกสำรอง .biometryCurrentSet ทำให้รายการใช้ไม่ได้หากลายนิ้วมือหรือใบหน้าที่ลงทะเบียนไว้เปลี่ยนแปลง และ .devicePasscode บังคับให้ป้อนรหัสผ่าน คุณสามารถรวมแฟล็กเหล่านี้เพื่อระบุข้อกำหนดด้านความปลอดภัยของคุณ

import Security
// .userPresence        -> biometric OR passcode
// .biometryAny         -> any enrolled biometric
// .biometryCurrentSet  -> invalidate on biometric change
// .devicePasscode      -> passcode only
let flags: SecAccessControlCreateFlags = [.userPresence]
_ = flags

การเพิ่มรายการที่ได้รับการปกป้อง

หากต้องการจัดเก็บข้อมูลลับที่จำกัดด้วยไบโอเมตริกซ์ ให้วางออบเจ็กต์ SecAccessControl ไว้ใต้ kSecAttrAccessControl การอ่านในภายหลังจะขอให้ผู้ใช้ยืนยันตัวตนก่อนส่งคืนข้อมูล

import Security
func saveProtected(_ data: Data, account: String,
                   control: SecAccessControl) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecValueData as String: data,
        kSecAttrAccessControl as String: control]
    return SecItemAdd(query as CFDictionary, nil)
        == errSecSuccess
}

การอ่านจะขอให้ผู้ใช้ยืนยันตัวตน

การอ่านรายการที่ได้รับการปกป้องจะเปิดส่วนติดต่อผู้ใช้สำหรับยืนยันตัวตนโดยอัตโนมัติ คุณสามารถส่งสตริงเหตุผลผ่าน kSecUseOperationPrompt เพื่อให้ข้อความแจ้งอธิบายว่าทำไมจึงต้องเข้าถึงข้อมูล การอ่านจะหยุดรอจนกว่าผู้ใช้จะยืนยันตัวตนหรือยกเลิก

import Security
func readProtected(account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecUseOperationPrompt as String:
            String(localized: "Unlock your saved key")]
    var out: CFTypeRef?
    return SecItemCopyMatching(query as CFDictionary,
        &out) == errSecSuccess ? out as? Data : nil
}

การเลือกระดับที่เหมาะสม

จับคู่นโยบายให้เหมาะกับความเสี่ยง:

  • โทเค็นเซสชันที่ใช้ในเบื้องหลัง: AfterFirstUnlock
  • โทเค็นที่ใช้เฉพาะในส่วนติดต่อผู้ใช้: WhenUnlocked
  • ข้อมูลลับมูลค่าสูง: SecAccessControl ร่วมกับ .userPresence และคลาส ThisDeviceOnly

ความเข้มงวดที่มากขึ้นปลอดภัยกว่า แต่จะทำให้เข้าถึงจากเบื้องหลังไม่ได้ จึงต้องสร้างสมดุลระหว่างทั้งสองด้าน

import Security
// High-value: biometric-gated, device-bound, no backup
let control = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
    .userPresence, nil)
_ = control

ตรวจสอบความเข้าใจ

ทบทวนว่าคลาสการเข้าถึงใดเหมาะกับข้อมูลลับที่จำเป็นต้องใช้ในเบื้องหลัง

สรุปทบทวน

คุณได้เรียนรู้การจำกัดการเข้าถึงรายการในพวงกุญแจ:

  • kSecAttrAccessible กำหนดความพร้อมใช้งานตามสถานะการล็อก ได้แก่ WhenUnlocked, AfterFirstUnlock และตัวแปร ...ThisDeviceOnly ที่ไม่รวมรายการไว้ในข้อมูลสำรอง
  • WhenPasscodeSetThisDeviceOnly ผูกการใช้งานรายการไว้กับการมีรหัสผ่าน
  • SecAccessControl ร่วมกับแฟล็กอย่าง .userPresence หรือ .biometryCurrentSet จะกำหนดให้ยืนยันตัวตนขณะอ่านข้อมูล
  • เลือกระดับที่เข้มงวดที่สุดซึ่งยังรองรับรูปแบบการเข้าถึงของคุณ

คำถามที่พบบ่อย

บทเรียน “การควบคุมการเข้าถึง Keychain” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การควบคุมการเข้าถึง Keychain” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การควบคุมการเข้าถึง Keychain”

จำกัดการเข้าถึงรายการด้วยไบโอเมตริกซ์และการปลดล็อกอุปกรณ์ คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การควบคุมการเข้าถึง Keychain” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การจัดเก็บข้อมูลลับใน Keychain
  2. การควบคุมการเข้าถึง Keychain
  3. การยืนยันตัวตนด้วยข้อมูลชีวมิติ
  4. การปกป้องข้อมูลและการเข้ารหัส
← กลับไปที่ Swift Academy