我的問題涉及iOS中的鑰匙串(iPhone,iPad,...)。我認爲(但我不確定)在Mac OS X下實施鑰匙鏈是否會給出同樣的問題並提供相同的答案。什麼使鑰匙串項目在iOS中獨一無二?
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
,哪些屬性使鑰匙串項目具有唯一性?
有關於此的[博客條目](http://useyourloaf.com/blog/2010/04/28/keychain-duplicate-item-when-adding-password.html)。 – bobobobo 2013-10-10 21:13:01