Minha pergunta diz respeito a chaveiros no iOS (iPhone, iPad, ...). Acho (mas não tenho certeza) que a implementação de chaveiros no Mac OS X levanta a mesma questão com a mesma resposta.
O iOS oferece cinco tipos (classes) de itens de chaveiro. Você deve escolher um desses cinco valores para a chave kSecClass
para determinar o 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)
Depois de muito tempo de documentação maçãs leitura, blogs e fórum-entradas, eu descobri que um item de chaveiro do tipo kSecClassGenericPassword
obtém sua singularidade dos atributos kSecAttrAccessGroup
, kSecAttrAccount
e kSecAttrService
.
Se esses três atributos na solicitação 1 forem iguais aos da solicitação 2, você receberá o mesmo item de chaveiro de senha genérica, independentemente de quaisquer outros atributos. Se um (ou dois ou todos) desses atributos alterar seu valor, você obterá itens diferentes.
Mas kSecAttrService
só está disponível para itens do tipo kSecClassGenericPassword
, portanto, não pode fazer parte da "chave única" de um item de qualquer outro tipo e parece não haver documentação que indique claramente quais atributos determinam exclusivamente um item de chaveiro.
O código de amostra na classe "KeychainItemWrapper" de "GenericKeychain" usa o atributo kSecAttrGeneric
para tornar um item único, mas isso é um bug. As duas entradas neste exemplo são armazenadas apenas como duas entradas distintas, porque kSecAttrAccessGroup
são diferentes (uma tem o grupo de acesso definido, a outra o deixa livre). Se você tentar adicionar uma 2ª senha sem um grupo de acesso, usando o da Apple KeychainItemWrapper
, você falhará.
Então, por favor, responda às minhas perguntas:
- É verdade, que a combinação de
kSecAttrAccessGroup
,kSecAttrAccount
ekSecAttrService
é a "chave única" de um item de chaveiro cuja kSecClass ékSecClassGenericPassword
? - Quais atributos tornam um item de chaveiro único se
kSecClass
não forkSecClassGenericPassword
?