La mia domanda riguarda i portachiavi in iOS (iPhone, iPad, ...). Penso (ma non sono sicuro) che l'implementazione dei portachiavi in Mac OS X solleva la stessa domanda con la stessa risposta.
iOS fornisce cinque tipi (classi) di elementi portachiavi. Devi scegliere uno di questi cinque valori per la chiave kSecClass
per determinare il tipo:
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)
Dopo lungo periodo di documentazione di lettura mele, blog e forum-iscrizioni, ho scoperto che una voce di portachiavi di tipo kSecClassGenericPassword
ottiene la sua unicità dagli attributi kSecAttrAccessGroup
, kSecAttrAccount
e kSecAttrService
.
Se questi tre attributi nella richiesta 1 sono gli stessi della richiesta 2, si riceve lo stesso elemento portachiavi con password generica, indipendentemente da qualsiasi altro attributo. Se uno (o due o tutti) di questi attributi cambia il suo valore, otterrai elementi diversi.
Ma kSecAttrService
è disponibile solo per elementi di tipo kSecClassGenericPassword
, quindi non può far parte della "chiave univoca" di un elemento di qualsiasi altro tipo e non sembra esserci alcuna documentazione che indichi chiaramente quali attributi determinano in modo univoco un elemento portachiavi.
Il codice di esempio nella classe "KeychainItemWrapper" di "GenericKeychain" utilizza l'attributo kSecAttrGeneric
per rendere un elemento univoco, ma si tratta di un bug. Le due voci solo in questo esempio sono memorizzate come due voci distinte, perché la loro kSecAttrAccessGroup
è diversa (una ha il gruppo di accesso impostato, l'altra lo lascia libero). Se provi ad aggiungere una seconda password senza un gruppo di accesso, utilizzando quello di Apple KeychainItemWrapper
, fallirai.
Quindi, per favore, rispondi alle mie domande:
- E 'vero, che la combinazione di
kSecAttrAccessGroup
,kSecAttrAccount
edkSecAttrService
è la "chiave unica" di un elemento portachiavi cui kSecClass èkSecClassGenericPassword
? - Quali attributi rendono unico un oggetto portachiavi se
kSecClass
non lo èkSecClassGenericPassword
?