我的问题涉及 iOS 中的钥匙串(iPhone、iPad、...)。我认为(但不确定)在 Mac OS X 下实现钥匙串会引发相同的问题和相同的答案。
iOS 提供了五种类型(类)的钥匙串项。您必须为键选择这五个值之一kSecClass
来确定类型:
kSecClassGenericPassword used to store a generic password
kSecClassInternetPassword used to store an internet password
kSecClassCertificate used to store a certificate
kSecClassKey used to store a kryptographic key
kSecClassIdentity used to store an identity (certificate + private key)
经过长时间阅读苹果文档、博客和论坛条目后,我发现 keychain 类型的项kSecClassGenericPassword
从属性中获取其唯一性kSecAttrAccessGroup
,kSecAttrAccount
并且kSecAttrService
.
如果请求 1 中的这三个属性与请求 2 中的相同,那么无论任何其他属性如何,您都会收到相同的通用密码钥匙串项。如果此属性中的一个(或两个或全部)更改其值,那么您将获得不同的项目。
但kSecAttrService
仅适用于 type 的项目kSecClassGenericPassword
,因此它不能成为任何其他类型项目的“唯一键”的一部分,并且似乎没有文档清楚地指出哪些属性唯一地确定了钥匙串项目。
“GenericKeychain”的“KeychainItemWrapper”类中的示例代码使用该属性kSecAttrGeneric
使项目唯一,但这是一个错误。此示例中的两个条目仅存储为两个不同的条目,因为它们kSecAttrAccessGroup
是不同的(一个设置了访问组,另一个让它自由)。如果您尝试在没有访问组的情况下添加第二个密码,使用 Apple 的KeychainItemWrapper
,您将失败。
所以,请回答我的问题:
- 是真的吗
kSecAttrAccessGroup
,kSecAttrAccount
和的组合kSecAttrService
是 kSecClass 的钥匙串项的“唯一键”kSecClassGenericPassword
吗? kSecClass
如果不是,哪些属性使钥匙串项目唯一kSecClassGenericPassword
?