Mi pregunta se refiere a los llaveros en iOS (iPhone, iPad, ...). Creo (pero no estoy seguro) que la implementación de llaveros en Mac OS X plantea la misma pregunta con la misma respuesta.
iOS proporciona cinco tipos (clases) de elementos de llavero. Debe elegir uno de esos cinco valores para que la clave kSecClass
determine el 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)
Después de mucho tiempo de leer la documentación de las manzanas, los blogs y las entradas al foro, descubrí que un elemento de tipo llavero kSecClassGenericPassword
obtiene su singularidad de los atributos kSecAttrAccessGroup
,kSecAttrAccount
y kSecAttrService
.
Si esos tres atributos en la solicitud 1 son los mismos que en la solicitud 2, entonces recibirá el mismo elemento de llavero de contraseña genérico, independientemente de cualquier otro atributo. Si uno (o dos o todos) de estos atributos cambia su valor, obtendrá elementos diferentes.
Pero kSecAttrService
solo está disponible para artículos de tipokSecClassGenericPassword
, por lo que no puede ser parte de la "clave única" de un elemento de ningún otro tipo, y parece que no hay documentación que indique claramente qué atributos determinan de manera única un elemento de llavero.
El código de muestra en la clase "KeychainItemWrapper" de "GenericKeychain" usa el atributo kSecAttrGeneric
para hacer que un elemento sea único, pero esto es un error. Las dos entradas en este ejemplo solo se almacenan como dos entradas distintas, porque kSecAttrAccessGroup
son diferentes (una tiene el grupo de acceso configurado, la otra lo deja libre). Si intenta agregar una segunda contraseña sin un grupo de acceso, utilizando Apple KeychainItemWrapper
, fallará.
Entonces, por favor, responda mis preguntas:
- Es cierto, que la combinación de
kSecAttrAccessGroup
,kSecAttrAccount
ykSecAttrService
es la "clave única" de un elemento llavero cuya kSecClass eskSecClassGenericPassword
? - ¿Qué atributos hacen que un elemento de llavero sea único si
kSecClass
no lo eskSecClassGenericPassword
?