ios - seguridad - como ver las contraseñas en el llavero de icloud
¿Es posible usar la autenticación de identificación táctil y el uso compartido de llavero en una aplicación de iOS? (2)
Creo que puedo haber encontrado la respuesta a esta
En el video 711 de WWDC 2014, lo siguiente se menciona a las 31:48
Elementos protegidos de ACL - Sin sincronización, sin copia de seguridad
Por lo tanto, la autenticación Touch ID no se puede usar para compartir llaves entre dispositivos ya que esos elementos son solo para dispositivos
He podido implementar con éxito TouchID con llavero, así como compartir llavero (sincronizar elementos de llavero entre múltiples dispositivos) por separado. Cuando intento hacer ambas cosas, aparece un error "-50" que no es válido para los parámetros. Del siguiente código, la eliminación de kSecAttrAccessControl o kSecAttrSynchronizable funciona como se espera.
Basándome en mi experiencia (leí, algunos días de frustración) hasta el momento, y en las capacidades de algunas tools simplificación de la API de llavero como UICKeychainStore , parece que si utilizo la autenticación de identificación táctil, el intercambio de llavero no funcionaría y viceversa. Estoy buscando una documentación de Apple que diga eso, pero no puedo encontrarla.
He SecItem.h página SecItem.h de Apple, y una información útil que encontré indica lo siguiente sobre kSecAttrAccessible y kSecAttrSynchronizable : "Si ambos atributos se especifican en OS X o iOS, el valor de la clave kSecAttrAccessible solo puede ser uno cuyo nombre no finaliza con "ThisDeviceOnly", ya que no se pueden sincronizar con otro dispositivo ". Sin embargo, no estoy usando" ThisDeviceOnly "(actualmente estoy usando kSecAttrAccessibleSiempre para propósitos de prueba)
¿Puede ayudarnos a señalar si y dónde Apple ha documentado esta limitación? Eso me ayudaría a documentarlo para los registros y seguir adelante. Gracias.
- (void)addKeychainItemWithIdentifier:(NSString *)identifier andData:(NSData *)data {
CFErrorRef error = NULL;
SecAccessControlRef sacObject;
sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleAlways,
kSecAccessControlUserPresence, &error);
if(sacObject == NULL || error != NULL)
{
NSString *msg0 = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_CAN_CREATE_OBJECT", nil), error];
[self printResultWithMessage:msg0];
return;
}
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecValueData: data,
(__bridge id)kSecAttrAccessible:(__bridge id)kSecAttrAccessibleAlways,
(__bridge id)kSecAttrService: identifier,
(__bridge id)kSecAttrSynchronizable:(__bridge id)kCFBooleanTrue,
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
};
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
NSError *statuserror = [NSError errorWithDomain:NSOSStatusErrorDomain code:status userInfo:nil];
[self printResultWithMessage:[self keychainErrorToString:status]];
});
}
Este proyecto de ejemplo podría ayudar, el título es KeychainTouchID: Usar Touch ID con Keychain y LocalAuthentication :
https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html
Esto podría estar limitado a local, sin embargo, no se comparte.