Co sprawia, że element pęku kluczy jest unikalny (w systemie iOS)?
Moje pytanie dotyczy pęków kluczy w systemie iOS (iPhone, iPad, ...). Myślę (ale nie jestem pewien), że implementacja pęków kluczy w systemie Mac OS X stawia to samo pytanie z tą samą odpowiedzią.
iOS zapewnia pięć typów (klas) elementów pęku kluczy. Musisz wybrać jedną z tych pięciu wartości kluczakSecClass
określić typ:
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)
Po długim czasie czytania dokumentacji jabłek, blogów i wpisów na forum dowiedziałem się, że jest to przedmiot typu keychainkSecClassGenericPassword
uzyskuje wyjątkowość od atrybutówkSecAttrAccessGroup
, kSecAttrAccount
ikSecAttrService
.
Jeśli te trzy atrybuty w żądaniu 1 są takie same, jak w żądaniu 2, to otrzymujesz ten sam element pęku kluczy ogólnego hasła, niezależnie od innych atrybutów. Jeśli jeden (lub dwa lub wszystkie) z tych atrybutów zmieni swoją wartość, otrzymasz różne przedmioty.
AlekSecAttrService
jest dostępny tylko dla elementów typukSecClassGenericPassword
, więc nie może być częścią „unikalnego klucza” przedmiotu innego typu i wydaje się, że nie ma żadnej dokumentacji, która wyraźnie wskazywałaby, które atrybuty jednoznacznie określają element pęku kluczy.
Przykładowy kod w klasie „KeychainItemWrapper” w „GenericKeychain” używa atrybutukSecAttrGeneric
aby uczynić przedmiot wyjątkowym, ale jest to błąd. Dwa wpisy w tym przykładzie są przechowywane jako dwa różne wpisy, ponieważ ichkSecAttrAccessGroup
jest inny (jeden ma zestaw grupy dostępu, a drugi pozwala). Jeśli spróbujesz dodać drugie hasło bez grupy dostępu, za pomocą AppleKeychainItemWrapper
, nie zdasz.
Proszę więc odpowiedzieć na moje pytania:
Czy to prawda, że połączeniekSecAttrAccessGroup
, kSecAttrAccount
ikSecAttrService
jest „unikalnym kluczem” elementu pęku kluczy, którego jest kSecClasskSecClassGenericPassword
?Które atrybuty sprawiają, że element pęku kluczy jest unikalny, jeśli jestkSecClass
nie jestkSecClassGenericPassword
?