¿Qué hace que un elemento de llavero sea único (en iOS)?

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. Debes elegir uno de esos cinco valores para la clave.kSecClass para determinar 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 manzanas, los blogs y las entradas del foro, descubrí que un elemento de llavero de tipokSecClassGenericPassword obtiene su singularidad de los atributoskSecAttrAccessGroup, kSecAttrAccount ykSecAttrService.

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, entonces obtienes diferentes elementos.

PerokSecAttrService Solo está disponible para artículos de tipo.kSecClassGenericPassword, por lo que no puede ser parte de la "clave única" de un elemento de cualquier otro tipo, y parece que no hay documentación que indique claramente qué atributos determinan de forma única un elemento de llavero.

El código de ejemplo en la clase "KeychainItemWrapper" de "GenericKeychain" usa el atributokSecAttrGeneric para hacer un artículo único, pero esto es un error. Las dos entradas en este ejemplo solo se almacenan como dos entradas distintas, porque suskSecAttrAccessGroup es diferente (uno tiene el grupo de acceso establecido, el otro lo deja libre). Si intenta agregar una segunda contraseña sin un grupo de acceso, utilice AppleKeychainItemWrapper, Tú fallarás.

Entonces, por favor, responde a mis preguntas:

¿Es cierto que la combinación dekSecAttrAccessGroup, kSecAttrAccount ykSecAttrService es la "clave única" de un elemento de llavero cuyo kSecClass eskSecClassGenericPassword?¿Qué atributos hacen que un elemento de llavero sea único si sukSecClass no eskSecClassGenericPassword?

Respuestas a la pregunta(3)

Su respuesta a la pregunta