ver puedo pudo problema llavero guardadas descargar debido cuentas contraseñas configurar con comunicación actualizar iphone security ios ipad keychain

pudo - no puedo actualizar mi iphone 6



¿Es posible actualizar el valor kSecAttrAccessible de un elemento de Llavero? (2)

¿Es posible actualizar el valor del atributo kSecAttrAccessible de los elementos existentes en el llavero? Parece que no se puede cambiar después de que el elemento se haya agregado al llavero. Los siguientes pasos respaldan mi suposición.

Agrega un nuevo artículo al llavero:

NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER" dataUsingEncoding:NSUTF8StringEncoding]; NSData *encodedPassword = [@"PASSWORD" dataUsingEncoding:NSUTF8StringEncoding]; // Construct a Keychain item NSDictionary *keychainItem = [NSDictionary dictionaryWithObjectsAndKeys: kSecClassGenericPassword, kSecClass, encodedIdentifier, kSecAttrGeneric, encodedIdentifier, kSecAttrService, @"USERNAME", kSecAttrAccount, kSecAttrAccessibleWhenUnlocked, kSecAttrAccessible, encodedPassword, kSecValueData nil]; // Add item to Keychain OSStatus addItemStatus = SecItemAdd((CFDictionaryRef)keychainItem, NULL);

Posteriormente, cambie el atributo kSecAttrAccessible de kSecAttrAccessibleWhenUnlocked a kSecAttrAccessibleAfterFirstUnlock :

NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER" dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: kSecClassGenericPassword, kSecClass, encodedIdentifier, kSecAttrGeneric, encodedIdentifier, kSecAttrService, nil]; NSDictionary *updatedAttributes = [NSDictionary dictionaryWithObject:kSecAttrAccessibleAfterFirstUnlock forKey:kSecAttrAccessible]; OSStatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)updatedAttributes);

El problema con este enfoque es que updateItemStatus siempre genera el estado errSecUnimplemented .

Creo que debería ser posible actualizar el valor de kSecAttrAccessible porque los requisitos de las aplicaciones cambian. ¿Qué kSecAttrAccessible si una aplicación agregó diez elementos al llavero en el pasado sin especificar la clase de protección con kSecAttrAccessible ? El llavero asigna implícitamente a los nuevos elementos el valor kSecAttrAccessibleWhenUnlocked si el desarrollador no ha establecido explícitamente la clase de protección. Más tarde, el desarrollador debe cambiar la clase de protección a kSecAttrAccessibleAfterFirstUnlock porque la aplicación debe acceder a ella en segundo plano (Multitarea). ¿Cómo puede el desarrollador lograr eso?

Ya hay un subproceso en los foros de desarrolladores de Apple, pero aún no ha dado una respuesta: https://devforums.apple.com/thread/87646?tstart=0


Después de abrir un incidente de soporte en Apple Developer Technical Support (ADTS), recibí una respuesta que responde a esta pregunta. SecItemUpdate() requiere que los datos del elemento de Keychain a través del atributo kSecValueData realicen la actualización del atributo kSecAttrAccessible . Según ADTS, esta restricción actualmente no está documentada en la documentación de referencia.

NSData *encodedIdentifier = [@"BUNDLE_IDENTIFIER" dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys: kSecClassGenericPassword, kSecClass, encodedIdentifier, kSecAttrGeneric, encodedIdentifier, kSecAttrService, nil]; // Obtain the Keychain item''s data via SecItemCopyMatching() NSData *itemData = ...; NSDictionary *updatedAttributes = [NSDictionary dictionaryWithObjectsAndKeys: kSecAttrAccessibleAfterFirstUnlock, kSecAttrAccessible, (CFDataRef)itemData, kSecValueData, nil]; OSStatus updateItemStatus = SecItemUpdate((CFDictionaryRef)query, (CFDictionaryRef)updatedAttributes); // updateItemStatus should have the value errSecSuccess


No pude conseguir que la otra respuesta funcionara. Terminé probando kSecAttrAccessibile y, si no era lo que quería, registré el valor y los atributos en el llavero en variables locales, restablecí el llavero, configuré kSecAttrAccessible según lo deseado y luego establecí el valor y los atributos en el llavero a su configuración original.