Prima di tutto, ho visto la sessione del WWDC 2013 sulla protezione dei segreti con il portachiavi. Voglio fare un archivio di passcode di base. Ho guardato l'intero video, ma ho trovato ciò di cui avevo bisogno nei primi 10 minuti del video. Sembra semplice, ma non capisco completamente come funzionano la codifica e il recupero dei dati.secItemCopyMatching restituisce dati nil
PROBLEMA: dopo secItemCopyMatching, controllo l'oggetto NSData per verificare che non sia nullo prima di convertirlo in NSString. Il problema è che è sempre nullo. Di seguito è riportato come sto salvando la voce o l'aggiornamento del portachiavi, seguito da come lo sto recuperando. Qualsiasi aiuto e spiegazione sarebbe molto apprezzato.
AGGIORNAMENTO (MODIFICATO): Fruttato Geek, grazie per la risposta. Ho aggiornato il mio codice qui sotto utilizzando __bridge. Il mio problema ora si riduce a, sto memorizzando e recuperando la password correttamente? Ho sbagliato entrambi o solo uno o l'altro? La mia istanza NSData è sempre nullo. Sto controllando i codici di restituzione e il mio SecItemAdd e SecItemUpdate (quando esiste la voce keychaing) funzionano correttamente. Non riesco a recuperare il valore di stringa dei dati (passcode) memorizzati per confrontarlo con il passcode inserito dall'utente. Apprezzo l'aiuto ragazzi e ragazze. Ecco quello che sto facendo ora:
UPDATE # 2: (a cura con le risposte di Fruity Geek e la versione finale di lavoro le mie modifiche includono solo le modifiche al codice qui sotto..)
Set entrata portachiavi:
NSData *secret = [_backupPassword dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: twServiceName,
(__bridge id)kSecAttrAccount: twAccountName,
(__bridge id)kSecValueData: secret,
};
OSStatus status =
SecItemAdd((__bridge CFDictionaryRef)query, NULL);
if (status == errSecDuplicateItem) {
// this item exists in the keychain already, update it
query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: twServiceName,
(__bridge id)kSecAttrAccount: twAccountName,
};
NSDictionary *changes = @{
(__bridge id)kSecValueData: secret,
};
status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)changes);
}
recuperare la password dal portachiavi:
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: twServiceName,
(__bridge id)kSecAttrAccount: twAccountName,
(__bridge id)kSecReturnData: @YES,
};
NSData *data = NULL;
CFTypeRef dataTypeRef = (__bridge CFTypeRef)data;
OSStatus status =
SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);
NSData *data = (__bridge NSData *)dataTypeRef;
NSString *passcode = @"none";
if (status == errSecSuccess) {
// we found a keychain entry, set the passcode
if (data)
passcode = [NSString stringWithUTF8String:[data bytes]];
}
twServiceName e twAccountName sono NSStrings statici.
Come ho già detto, non faccio esattamente quello che sto facendo con __bridge o CFTypeRef. Ho esaminato i documenti delle mele, numerosi post qui e altri siti, ma il portachiavi e questi termini sono nuovi di zecca per me e sto ancora cercando di capirlo. Sperando che qualcuno qui possa segnalare il mio errore e aiutarmi a capire. Grazie in anticipo per l'aiuto.
iOS 7/Xcode 5
Grazie. Questo aiuta a chiarire __bridge per me. Sto controllando il codice di ritorno. Ho pensato che provare ad aggiungere avrebbe raggiunto il risultato come secItemCopyMatching. O la voce non esiste e l'aggiunta funziona, o torno errSecDuplicateItem nel qual caso aggiorno la voce con la password. – knarf74
È stato troppo lento a modificare il mio post precedente dopo aver premuto invio non rendendosi conto che avrebbe inviato il mio post ... Il mio problema rimane, sto codificando e memorizzando correttamente la password e come dovrei recuperarla? Dopo averlo memorizzato, cerco CopyMatching e rimuovo lo pssword, ma la mia istanza NSData è sempre nullo. Permettimi di aggiornare il mio codice nel post ... – knarf74
ha trascurato il tuo ultimo commento su writeToKeychain .... leggendo attraverso questo ora. – knarf74