移动/游戏
在 iOS/macOS 上处理 Keychain、生物识别…
适用于在 Apple 平台(iOS/macOS)用 Swift 做客户端安全:Keychain 密钥存储、生物识别门控、CryptoKit 加密、Secure Enclave、证书固定、凭证迁移与 OWASP MASVS/MASTG 合规。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 iOS/macOS 上处理 Keyc特定
解决思路
- 先对请求分类:审查现有代码、改进或迁移代码、实现新安全代码;再按分类加载参考文件。
- 审查现有代码时:运行 Review Checklist,然后加载 references/common-anti-patterns.md,并针对每个失败领域加载对应领域参考文件;报告严重级别、证据和修正后的模式。
- 改进或迁移代码时:识别迁移类型,加载迁移和目标领域参考文件,保留现有数据,验证新条目,只有成功后才移除旧存储。
- 实现新的安全代码时:只加载最小必要的领域参考文件,使用提供的正确模式,包含 OSStatus 处理与测试,然后运行相关 checklist。
- 不要默认加载所有参考文件;按 progressive disclosure 只加载用户任务需要的文件。
- 最小安全 Keychain 写入:使用分开的 add、identity 和 update 字典;分别处理每个 OSStatus。
- 最小安全 Keychain 写入示例做法:identity 字典设置 kSecClass: kSecClassGenericPassword、kSecAttrService、kSecAttrAccount;add 字典加入 kSecValueData 和 kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly;调用 SecItemAdd,在 errSecSuccess 返回,在 errSecDuplicateItem 时用 SecItemUpdate 更新 kSecValueData,其他 status 抛 KeychainError。
- 读取、删除、访问控制、锁定设备和测试模式加载 references/keychain-fundamentals.md。
- 涉及通用 keychain CRUD 或 OSStatus 处理时,加载 references/keychain-fundamentals.md。
- 涉及选择 kSecClass 或条目 identity 时,加载 references/keychain-item-classes.md。
- 涉及 accessibility classes 或 SecAccessControl 时,加载 references/keychain-access-control.md。
- 涉及 Face ID、Touch ID 或生物识别门控密钥时,加载 references/biometric-authentication.md。
- 涉及 Secure Enclave 密钥时,加载 references/secure-enclave.md。
- 涉及 Hashing、HMAC、AES-GCM、ChaChaPoly、HKDF、PBKDF2 时,加载 references/cryptokit-symmetric.md。
- 涉及 Signing、ECDH、HPKE、ML-KEM、ML-DSA 时,加载 references/cryptokit-public-key.md。
- 涉及 OAuth tokens、API keys、logout、refresh rotation 时,加载 references/credential-storage-patterns.md。
- 涉及 App/extension keychain sharing 时,加载 references/keychain-sharing.md。
- 涉及证书信任、SPKI pinning、mTLS 时,加载 references/certificate-trust.md。
- 涉及 UserDefaults/plist/NSCoding 迁移时,加载 references/migration-legacy-stores.md。
- 涉及 unit、integration、simulator、device 或 CI 测试时,加载 references/testing-security-code.md。
- 涉及 OWASP MASVS/MASTG 或企业审计映射时,加载 references/compliance-owasp-mapping.md。
- 完整安全审查时,先加载 references/common-anti-patterns.md,然后加载每个触及领域的参考文件。
- 安全不变量:永远不要把 tokens、passwords、API keys、signing keys 或 refresh tokens 存入 UserDefaults、Info.plist、.xcconfig、源代码、日志、文件或 NSCoding archives;使用 Keychain 或运行时获取 secrets。
- 安全不变量:永远不要忽略 OSStatus;每个 SecItemAdd、SecItemCopyMatching、SecItemUpdate、SecItemDelete 路径必须处理成功和预期失败,如 errSecDuplicateItem、errSecItemNotFound、errSecInteractionNotAllowed。
- 安全不变量:永远不要将 LAContext.evaluatePolicy() 作为 secret 的唯一门禁;用 SecAccessControl 将受保护 secrets 绑定到 keychain items,让 keychain 访问触发 LocalAuthentication。
- 安全不变量:添加 keychain items 时始终显式设置 kSecAttrAccessible 或 kSecAttrAccessControl。
- 安全不变量:持久 keychain 写入始终使用 add-or-update;正常更新路径不要 delete-then-add。
- 安全不变量:将 SecItem* 工作移出 main actor;使用 actor 或 serial queue 访问 keychain。
- 安全不变量:在 macOS AppKit targets 上,除非刻意操作 legacy file-based keychain items,否则使用 kSecUseDataProtectionKeychain: true 目标 data protection keychain。
- 安全不变量:永远不要用同一 key 重用 AES-GCM nonce。
- 安全不变量:永远不要把原始 ECDH SharedSecret 字节用作 symmetric key;用 HKDF 或 X9.63 derivation 派生。
- 安全不变量:永远不要将 Insecure.MD5 或 Insecure.SHA1 用于安全目的。
- 仅对上述安全不变量和 common-anti-patterns.md 中匹配的 anti-patterns 使用指令性语言;本列表之外的架构选择使用建议性语言。
- 当部署目标未知时默认 iOS 17+ 和 Swift concurrency 示例;用户要求旧目标时保留 iOS 13+ 兼容说明;将 iOS 26 CryptoKit post-quantum APIs 视为 availability-gated。
- 使用 authentication 处理 Sign in with Apple、passkeys、OAuth UI flows、ASAuthorizationController、credential state、account sign-in UX。
- 当任务不涉及 storage、key lifecycle、protocol/trust design、Secure Enclave policy、certificate trust、misuse review 或 compliance 时,使用 cryptokit 处理 CryptoKit 原语 API 语法和示例。
- 当工作涉及 key ownership、derivation、storage、rotation/recovery、Secure Enclave、HPKE/PQC migration、protocol trust boundaries 或 misuse analysis 时,将应用级 E2E encryption 安全审查保留在本技能。
- 使用 device-integrity 处理 DeviceCheck 和 App Attest attestation/assertion flows。
- 使用 ios-networking 处理 URLSession、request pipelines、ATS configuration、retries、caching、reachability、transport architecture。
- 使用 app-store-review 处理 privacy manifests、ATT、App Review guideline compliance、submission readiness。
- 本技能提到这些领域仅用于识别安全交接。
- 代码审查和迁移计划使用 Review Checklist,每项标记 pass、fail 或 not applicable;每个失败引用参考文件和严重级别。
- Review Checklist:Secrets 不在 UserDefaults、plists、source、logs、files 或 archives 中存储。
- Review Checklist:每个 SecItem* 调用检查 OSStatus 并处理常见可恢复错误。
- Review Checklist:生物识别访问 secrets 通过 SecAccessControl 绑定 keychain,而不是来自 LAContext.evaluatePolicy() 的独立 Bool。
- Review Checklist:Keychain add 字典设置显式 accessibility policy。
- Review Checklist:Keychain 写入使用 add-or-update,而不是 delete-then-add。
- Review Checklist:Keychain 工作与 UI/main-actor 代码隔离。
- Review Checklist:选择的 kSecClass 与条目类型和 primary-key attributes 匹配。
- Review Checklist:CryptoKit 代码避免 nonce reuse、raw shared-secret use、weak hashes 和 hardcoded keys。
- Review Checklist:自定义加密设计识别 key ownership、derivation、storage、rotation/recovery、availability gates 和 protocol/trust boundaries。
- Review Checklist:Secure Enclave 代码检查 availability,处理 simulator/device 差异,只持久化 dataRepresentation,并为 device-bound keys 设计。
- Review Checklist:App/extension sharing 使用完整 Team ID access groups,并且每个 target 有匹配 entitlements。
- Review Checklist:Certificate trust 使用当前 SecTrust APIs,验证 hostname/policy,并在需要 pinning 时使用 SPKI 或 CA pinning。
- Review Checklist:macOS keychain 代码有意选择 data protection 或 file-based keychain 行为。
- Review Checklist:测试覆盖 success、duplicate、missing item、locked-device、simulator/device 和 migration 路径(适用时)。
- Review Checklist:请求合规时包含 OWASP MASVS/MASTG mappings。
- 避免常见错误:生成不完整 keychain 示例,缺少 duplicate 处理和 errSecItemNotFound 处理。
- 避免常见错误:添加 biometric UI 但 secret 在没有 keychain access control 时仍可读。
- 避免常见错误:通过省略属性隐式选择 kSecAttrAccessibleWhenUnlocked。
- 避免常见错误:使用已废弃的 kSecAttrAccessibleAlways 或 kSecAttrAccessibleAlwaysThisDeviceOnly。
- 避免常见错误:在同一个 add query 中混用 kSecAttrAccessible 和 kSecAttrAccessControl。
- 避免常见错误:将 Secure Enclave keys 视为可导入、可导出、可同步或适合对称加密。
- 避免常见错误:在 iOS 26 之前声称 SHA-3、ML-KEM、ML-DSA 或 X-Wing CryptoKit APIs 可用。
- 避免常见错误:在 iOS 17 之前将 HPKE 视为可用。
- 避免常见错误:实现 certificate pinning 时只哈希原始 key bytes,而不是正确的 SPKI 表示。
- 避免常见错误:将本技能扩展为 account-login、networking、App Attest 或 App Store review 指导,而不是交接给 sibling skills。
- 输出规则:对安全发现说明严重级别:CRITICAL 用于可利用的 secret 或 cryptography 失败,HIGH 用于静默安全边界/数据丢失问题,MEDIUM 用于脆弱或不完整加固。
- 输出规则:当存在具体 anti-pattern 时,为实现审查包含错误和修正代码示例。
- 输出规则:推荐带版本 API 时包含最低 iOS/macOS availability。
- 输出规则:为每个实质性安全模式引用支持它的参考文件。
- 输出规则:对 keychain 代码,在示例中包含 OSStatus 处理和显式 accessibility。
- 输出规则:对实现或迁移答案,以 `## Reference Files` 结尾,并列出已加载参考文件及一行用途。
- 输出规则:不要编造 WWDC session numbers 或 source citations;如果声明不在已加载参考文件或官方 Apple 文档中,说明需要验证。
- references/keychain-fundamentals.md:SecItem CRUD、OSStatus 处理、add-or-update、macOS data protection keychain。
- references/keychain-item-classes.md:kSecClass 选择、primary keys、certificates、identities。
- references/keychain-access-control.md:Accessibility constants、SecAccessControl、background access、data protection。
- references/biometric-authentication.md:Keychain-bound biometrics、LAContext、enrollment-change handling。
- references/secure-enclave.md:Secure Enclave constraints、persistence、biometric keys、iOS 26 PQ APIs。
- references/cryptokit-symmetric.md:SHA、HMAC、AES-GCM、ChaChaPoly、HKDF、PBKDF2。
- references/cryptokit-public-key.md:Signing、key agreement、HPKE、ML-KEM、ML-DSA、key formats。
- references/credential-storage-patterns.md:OAuth tokens、API keys、rotation、logout cleanup。
- references/keychain-sharing.md:Access groups、extensions、iCloud sync、macOS access groups。
- references/certificate-trust.md:SecTrust、SPKI/CA pinning、NSPinnedDomains、client certificates。
- references/migration-legacy-stores.md:UserDefaults/plist/NSCoding migration and cleanup。
- references/common-anti-patterns.md:Review backbone for insecure generated code。
- references/testing-security-code.md:Protocol mocks、real keychain tests、CI/device split。
- references/compliance-owasp-mapping.md:OWASP Mobile Top 10、MASVS、MASTG evidence mapping。
适用边界 · 注意事项
- 不适用于非 Apple 平台或非 Swift 客户端的移动安全实现。
- 不适用于账户登录 UX、网络传输、App Attest、App Store 审核等相邻领域;应交接给 authentication、ios-networking、device-integrity、app-store-review 等技能。
- 不适用于纯 CryptoKit API 语法问题,且不涉及存储、密钥生命周期、协议/信任设计、Secure Enclave 策略、证书信任、误用审查或合规;这类问题应交给 cryptokit。