2015-04-21 12 views
15

Sono riuscito a implementare TouchID con portachiavi e condivisione di portachiavi (sincronizzando gli elementi portachiavi tra più dispositivi) separatamente. Quando provo a eseguire entrambi, viene visualizzato un errore "-50" che non è valido. Dal codice qui sotto, rimuovendo sia kSecAttrAccessControl o kSecAttrSynchronizable funziona come previsto.È possibile utilizzare l'autenticazione Touch-ID e la condivisione del portachiavi in ​​un'app iOS?

base della mia esperienza (leggere - un paio di giorni di frustrazione) finora, e in base alle capacità di alcuni portachiavi API semplificazione tools come UICKeychainStore, sembra come se uso touch ID di autenticazione, portachiavi condivisione wouldn' t lavoro e viceversa. Sto cercando una documentazione Apple che lo dichiarerebbe, ma non riuscendo a trovarlo.

Ho passato attraverso la pagina di Apple SecItem.h, e informazioni utili Ho trovato afferma, a proposito kSecAttrAccessible e kSecAttrSynchronizable: “Se entrambi gli attributi sono specificati su entrambi OS X o iOS, il valore per il kSecAttrAccessible chiave può essere solo uno il cui nome non termina con “ThisDeviceOnly", come quelli che non possono sincronizzare a un altro dispositivo.”Tuttavia, non sto usando 'ThisDeviceOnly' (attualmente sto usando kSecAttrAccessibleAlways a scopo di test)

Puoi aiutare a segnalare se e dove Apple ha documentato questo limitazione? Questo mi aiuterebbe a documentarlo per i record e andare avanti. Grazie.

- (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]]; 
    }); 
} 
+0

buona domanda !! –

risposta

1

Questo progetto di esempio potrebbe aiutare, il titolo è KeychainTouchID: Utilizzo di tocco ID con portachiavi e LocalAuthentication:

https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html

Questo potrebbe essere limitata ai locali, però, nessuna condivisione.

+0

Sì, questo è il progetto a cui ho fatto riferimento per implementare l'autenticazione Touch ID. Tuttavia, non include la condivisione di portachiavi tra dispositivi. – SuPotter

+0

Qui potrei sbagliarmi, ma dal mio punto di vista il TouchID ha una propria memoria all'interno del dispositivo che non può essere letta dal sistema operativo in alcun modo per condividere i dati. Lo so solo guardando il [WWDC dove hanno annunciato TouchID] (https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QtwIwAA&url=http%3A % 2F% 2Fwww.youtube.com% 2Fwatch% 3Fv% 3D0mKEV7iYa3M & ei = 5fpMVfrCKNLdoATtiYCAAw & USG = AFQjCNFSMwAzN0v9xaccowf8kQYNW3b5pQ & SIG2 = RGd_w6XLPqFnmwBNo0MoqQ). – LunaCodeGirl

3

credo di aver trovato la risposta a questa

In WWDC 2014 il video 711, si precisa quanto segue a elementi protetti 31:48

ACL - nessuna sincronizzazione, il backup No

Quindi l'autenticazione Touch ID non può essere utilizzata per la condivisione di portachiavi tra dispositivi in ​​quanto tali elementi sono Device-Only