我的问题涉及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
是不同的(一个设置了访问组,另一个设置了访问组)。如果您尝试使用Apple的添加不带访问组的第二个密码KeychainItemWrapper
,则将失败。
所以,请回答我的问题:
- 这是真的,那的组合
kSecAttrAccessGroup
,kSecAttrAccount
并且kSecAttrService
是一个钥匙串项目,其kSecClass是“唯一钥匙”kSecClassGenericPassword
? - 哪些属性可使钥匙串项与众不同(如果
kSecClass
不是)kSecClassGenericPassword
?