语境
我正在开发一个 iOS 应用程序,它应该受到本地身份验证的保护。用户必须在打开应用程序后使用指纹/密码/…解锁应用程序。当应用程序在前台运行时,应用程序应保持解锁状态。当应用程序解锁时,应用程序必须访问钥匙串中的多个项目(应用程序运行时可能会多次访问某些项目)。
使用 .userPresence 进行钥匙串访问控制
将钥匙串项目的访问控制设置为在访问项目.userPresence
之前强制执行本地身份验证。但是,这并不真正适合我的用例,因为每次访问钥匙串中的项目时,用户都必须进行身份验证。
// storing keychain items with .userPresence access control
guard let accessControl = SecAccessControlCreateWithFlags(
nil,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.userPresence,
nil
) else {
throw CommonError("Unable to create access control flags")
}
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: account,
kSecAttrAccessControl: accessControl,
kSecValueData: ...
] as [String: Any]
SecItemAdd(query as CFDictionary, nil)
为了适合我的用例,我可以自己实现本地身份验证并使用kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
(而不是.userPresence
)存储钥匙串项。我担心,没有存储钥匙串项目.userPresence
可能会导致安全风险。kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
如果我自己实现本地身份验证并使用访问钥匙串项目而不是使用访问控制,它会有所不同.userPresence
吗?
// storing keychain items without access control
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: account,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
kSecValueData: ...
] as [String: Any]
SecItemAdd(query as CFDictionary, nil)
我找不到任何文章或官方资料来解释我的担忧。如果可以链接任何官方文档,或者甚至为我的用例提供更好的解决方案,我将不胜感激。
TL;博士
是否设置钥匙串项的访问控制以.userPresence
以任何方式提高安全性,或者如果我自己实现本地身份验证并将钥匙串项存储在其中,是否没有区别kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
?
谢谢您的帮助!