我的问题与 iOS (iPhone,iPad,...)中的钥匙链有关。我认为(但不确定)在 MacOSX 下键链的实现提出了同样的问题和相同的答案。
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)
After long time of reading apples documentation, blogs and forum-entries, I found out that a keychain item of type kSecClassGenericPassword
gets its uniqueness from the attributes kSecAttrAccessGroup
, kSecAttrAccount
and kSecAttrService
.
If those three attributes in request 1 are the same as in request 2, then you receive the same generic password keychain item, regardless of any other attributes. If one (or two or all) of this attributes changes its value, then you get different items.
但是 kSecAttrService
只适用于 kSecClassGenericPassword
类型的项目,因此它不能成为任何其他类型项目的“唯一键”的一部分,而且似乎没有文档清楚地指出哪些属性是唯一决定密钥链项目的。
“ GenericKeychain”的类“ KeychainItemWrapper”中的示例代码使用属性 kSecAttrGeneric
使项目唯一,但这是一个 bug。这个示例中的两个条目只存储为两个不同的条目,因为它们的 kSecAttrAccessGroup
是不同的(一个有访问组集,另一个让它自由)。如果你尝试在没有访问组的情况下使用苹果的 KeychainItemWrapper
添加第二个密码,你将会失败。
所以,请回答我的问题:
kSecAttrAccessGroup
、 kSecAttrAccount
和 kSecAttrService
的组合是一个 kSecClass 为 kSecClassGenericPassword
的密钥链项目的“唯一密钥”,这是真的吗?kSecClass
不是 kSecClassGenericPassword
,那么哪些属性使其成为唯一的?