我的问题涉及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)
经过长时间阅读苹果文档、博客和论坛文章,我发现类型为kSecClassGenericPassword
的钥匙串项从属性kSecAttrAccessGroup
、kSecAttrAccount
和kSecAttrService
中获得其唯一性。
如果请求1中的这三个属性与请求2中的相同,则无论其他属性如何,您都会收到相同的通用密码钥匙串项。如果一个(或两个或所有)这些属性改变了其值,那么您就会得到不同的条目。
但是kSecAttrService
仅适用于kSecClassGenericPassword
类型的条目,因此它不能成为任何其他类型的项目的“唯一键”的一部分,而且似乎没有文件指出哪些属性唯一确定了钥匙串项。
“GenericKeychain”类的“KeychainItemWrapper”中的示例代码使用属性kSecAttrGeneric
来使项目唯一,但这是一个错误。这个例子中的两个条目只存储为两个不同的条目,因为它们的kSecAttrAccessGroup
不同(一个设置了访问组,另一个不设置)。如果你尝试使用苹果的KeychainItemWrapper
添加第二个没有访问组的密码,你会失败。
所以,请回答我的问题:
- 组合
kSecAttrAccessGroup
、kSecAttrAccount
和kSecAttrService
是否是kSecClass为kSecClassGenericPassword
的钥匙串项的“唯一键”? - 如果
kSecClass
不是kSecClassGenericPassword
,哪些属性会使一个钥匙串项成为唯一的?