2012-03-15 4 views
25

Ho questo codice di tornare una password dal portachiavi per un dato nome utente NSString:iOS SFHFKeychainUtils fallendo * * a volte con l'errore -25.308 errSecInteractionNotAllowed

NSError *error = nil; 
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]; 
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error]; 
if(error != nil) 
    // log the error  

maggior parte del tempo per la maggior parte degli utenti questo tutto funziona benissimo - ma per alcuni utenti specifici questa chiamata sembra fallire (e portare avanti non) dove si restituisce il seguente errore:

The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.) 

questo è apparentemente errSecInteractionNotAllowed -, che da quello che ho letto io penso questo significa che è necessario un certo tipo di interazione con l'utente per accedere al portachiavi.

Qualcuno ha idea del motivo per cui questa chiamata potrebbe non riuscire solo per alcuni utenti specifici? Questa voce del portachiavi è specifica per la mia app, quindi perché è necessaria l'interazione con l'utente per accedervi?

Tutti gli indicatori molto apprezzate ...

risposta

40

OK così ho lavorato questo fuori alla fine.

Eventualmente ho risolto gli utenti che avevano problemi a impostare un codice di blocco sul proprio telefono. Se il telefono era bloccato, il sistema portachiavi stava restituendo l'errore -25308.

Se hai solo bisogno di accedere al portachiavi quando l'app è attiva nel forground non vedresti mai questo problema - ma se hai bisogno di continuare l'elaborazione quando il telefono è bloccato o se l'app è in background allora lo vedrei

Altrove ho letto che l'attributo di accesso predefinito per il sistema kechain è kSecAttrAccessibleAlways - ma penso che non sia aggiornato. Sembra che l'attributo di accesso predefinito per il sistema portachiavi sia tale che quando il telefono è bloccato con un codice pin, gli elementi non sono disponibili.

La correzione per questo è di cambiare il codice SFHFKeychainUtils per impostare un attributo specifico kSecAttrAccessible sugli elementi portachiavi che gestisce (che il codice originale non ha fatto - presumibilmente come pre-datato a questi attributi).

Questo wordpress updated version del codice SFHFKeychainUtils contiene le correzioni al suo interno - cerca kSecAttrAccessible per vedere dove hanno aggiunto il codice di attributo accessibile.

Spero che questo aiuti chiunque altro in esecuzione in questo ...

+2

Ho verificato questo su iOS4, iOS5 e iOS6. Su tutte le versioni iOS viene restituito il codice di errore errSecInteractionNotAllowed se i dati che non sono contrassegnati con kSecAttrAccessibleAlways vengono letti quando il dispositivo è in stato di blocco (ad esempio attività in background, download di Edicola ecc.). –

+5

kSecAttrAccessibleAlways non è una grande scelta: è possibile ottenere maggiori vantaggi in termini di sicurezza ed evitare comunque l'errore, utilizzando qualcosa come kSecAttrAccessibleAfterFirstUnlock (o un'impostazione ancora più restrittiva, se questo funziona per la propria app). – frankodwyer

+0

Posso confermare che, quando l'app è in primo piano ma il dispositivo è bloccato con password, la libreria portachiavi mi dà il -25308. Grazie ! – Magurizio