2014-12-21 8 views
8

Quindi ho una vecchia chiave di accesso sensibile che attualmente ha un'accessibilità di kSecAttrAccessible WhenUnlocked e voglio aggiornarla a kSecAttrAccessibleAfterFirstUnlock.kSecAttrAccessibleAfterFirstUnlock che non consente l'accesso anche dopo il primo sblocco iOS

sto usando Lockbox e chiamare questo:

[Lockbox setString:accessKey forKey:self.accessKeyName accessibility:kSecAttrAccessibleAfterFirstUnlock]; 

Che a sua volta, chiama questo:

-(BOOL)setObject:(NSString *)obj forKey:(NSString *)key accessibility:(CFTypeRef)accessibility 
{ 
    OSStatus status; 

    NSString *hierKey = [self _hierarchicalKey:key]; 

    // If the object is nil, delete the item 
    if (!obj) { 
     NSMutableDictionary *query = [self _query]; 
     [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService]; 
     status = SecItemDelete((LOCKBOX_DICTREF)query); 
     return (status == errSecSuccess); 
    } 

    NSMutableDictionary *dict = [self _service]; 
    [dict setObject: hierKey forKey: (LOCKBOX_ID) kSecAttrService]; 
    [dict setObject: (LOCKBOX_ID)(accessibility) forKey: (LOCKBOX_ID) kSecAttrAccessible]; 
    [dict setObject: [obj dataUsingEncoding:NSUTF8StringEncoding] forKey: (LOCKBOX_ID) kSecValueData]; 

    status = SecItemAdd ((LOCKBOX_DICTREF) dict, NULL); 
    if (status == errSecDuplicateItem) { 
     NSMutableDictionary *query = [self _query]; 
     [query setObject:hierKey forKey:(LOCKBOX_ID)kSecAttrService]; 
     status = SecItemDelete((LOCKBOX_DICTREF)query); 
     if (status == errSecSuccess) 
      status = SecItemAdd((LOCKBOX_DICTREF) dict, NULL); 
    } 
    if (status != errSecSuccess) 
     DLog(@"SecItemAdd failed for key %@: %d", hierKey, (int)status); 

    return (status == errSecSuccess); 
} 

Come potete vedere sopra, il codice Lockbox sembra per cercare di aggiungere la voce se c'è un duplicato. Ho inserito un breakpoint e posso confermare che funziona.

Tuttavia, a volte dà ancora un errore di:

<Error>: SecOSStatusWith error:[-25308] The operation couldn’t be completed. (OSStatus error -25308 - Remote error : The operation couldn‚Äôt be completed. (OSStatus error -25308 - ks_crypt: e00002e2 failed to unwrap item (class 6, bag: 0) Access to item attempted while keychain is locked.)) 

Non capisco perché vorrei essere sempre presente - ho già sbloccato il mio telefono e dovrebbe funzionare bene. Qualche idea?

Devo anche aggiungere che ho bisogno di accedere a questo quando l'app viene uccisa e riattivata in background attraverso un aggiornamento del monitoraggio della regione.

+0

Ehi, hai risolto questo problema? Sto affrontando un problema molto simile. L'accesso al mio portachiavi genera lo stesso errore quando l'app viene uccisa e avviata in background – SeaJelly

+0

@SeaJelly hai trovato la soluzione? –

risposta

4

Ho dovuto cancellare la vecchia chiave prima di quella nuova. Puoi farlo oppure puoi creare una nuova chiave con un nome diverso con il nuovo valore kSecAccessibility.