2014-12-21 10 views
8

Mam więc stary, wrażliwy klucz dostępu, który obecnie ma dostęp do kSecAttrAccessible When Unlocked i chcę go zaktualizować do kSecAttrAccessibleAfterFirstUnlock.kSecAttrAccessibleAfterFirstUnlock nie zezwalając na dostęp nawet po pierwszym odblokowaniu iOS

Używam Lockbox i nazywają to:

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

co z kolei wywołuje to:

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

Jak widać powyżej, kod Lockbox wydaje się starać, aby dodać pozycję jeśli jest duplikat. Umieściłem tam punkt przerwania i mogę potwierdzić, że działa.

Czasami jednak nadal daje błąd:

<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.)) 

Nie rozumiem dlaczego miałbym być coraz to - ja już odblokowany mój telefon i powinno działać dobrze. Jakieś pomysły?

Powinienem również dodać, że muszę uzyskać do niego dostęp, gdy aplikacja zostanie zabita i przywrócona w tle za pomocą aktualizacji monitorowania regionu.

+0

Hej, czy rozwiązałeś ten problem? Mam do czynienia z bardzo podobnym problemem. Mój dostęp do pęku kluczy zgłasza ten sam błąd, gdy aplikacja zostanie zabita i uruchomiona w tle – SeaJelly

+0

@SeaJelly znalazłeś rozwiązanie? –

Odpowiedz

4

Musiałem wyczyścić stary klucz przed nowym. Możesz to zrobić lub możesz utworzyć nowy klucz o innej nazwie z nową wartością kSecAccessibility.

Powiązane problemy