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.
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
@SeaJelly hai trovato la soluzione? –