2015-11-13 37 views
5

Uso il portachiavi per memorizzare dati sensibili.- errSecItemNotFound con iOS 9.2 beta 3

Da iOS 9.2 beta 3, non riesco a recuperare i dati sensibili creati da una versione precedente di iOS (ad esempio iOS 9.1). Ho un errore errSecItemNotFound quando si utilizza SecItemCopyMatching. Nessun problema con iOS 9.1 (né iOS 9.2 beta 2 né iOS 7.x/8.x/9.0).

Molto strano: il mio codice sorgente crea un nuovo dato sensibile se non esiste, quindi con iOS 9.2 beta 3 ho un nuovo dato sensibile, ma se torno a iOS 9.1, recupero i vecchi dati sensibili e così via, quando tornare a iOS 9.2 beta 3 ... come io uso la stessa identica domanda, sembra che il portachiavi è duplicato ...

Ecco il mio codice per aggiungere un dati sensibili:

NSMutableDictionary *symmetricKeyAttr = [NSMutableDictionary dictionary]; 
[symmetricKeyAttr setObject:(__bridge id)kSecAttrAccessibleWhenUnlockedThisDeviceOnly forKey:(__bridge id)kSecAttrAccessible]; 
[symmetricKeyAttr setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
[symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:CSSM_ALGID_AES] forKey:(__bridge id)kSecAttrKeyType]; 
[symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:(unsigned int)(kChosenCipherKeySize << 3)] forKey:(__bridge id)kSecAttrKeySizeInBits]; 
[symmetricKeyAttr setObject:[NSNumber numberWithUnsignedInt:(unsigned int)(kChosenCipherKeySize << 3)] 
forKey:(__bridge id)kSecAttrEffectiveKeySize]; 
[symmetricKeyAttr setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecAttrCanEncrypt]; 
[symmetricKeyAttr setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecAttrCanDecrypt]; 
[symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanDerive]; 
[symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanSign]; 
[symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanVerify]; 
[symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanWrap]; 
[symmetricKeyAttr setObject:(id)kCFBooleanFalse forKey:(__bridge id)kSecAttrCanUnwrap]; 
[symmetricKeyAttr setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 
[symmetricKeyAttr setObject:applicationTag forKey:(__bridge id)kSecAttrApplicationTag]; 
[symmetricKeyAttr setObject:sensitiveData forKey:(__bridge id)kSecValueData]; 
OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef) symmetricKeyAttr, NULL); 

Ecco il mio codice per ottenere dati sensibili:

NSMutableDictionary * querySymmetricKey = [NSMutableDictionary dictionary]; 
[querySymmetricKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass]; 
[querySymmetricKey setObject:[NSNumber numberWithUnsignedInt:CSSM_ALGID_AES] forKey:(__bridge id)kSecAttrKeyType]; 
[querySymmetricKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnData]; 
[querySymmetricKey setObject:applicationTag forKey:(__bridge id)kSecAttrApplicationTag]; 
[querySymmetricKey setObject:accessGroup forKey:(__bridge id)kSecAttrAccessGroup]; 
CFDataRef symmetricKeyDataRef = NULL; 
OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)querySymmetricKey, (CFTypeRef *)&symmetricKeyDataRef); 

Dove:

  • sensitiveData sono i dati sensibili da memorizzare (ad esempio < ac746cc2 80f72948 59d0d8b7 a5de4bad 5d9e9eb1 a400fba3 c85f3f2e 675d58bf>)
  • AccessGroup è la concatenazione di identificatore di squadra e l'applicazione
  • identificativo (ad esempio XXXXXXXXXX.com.toto.tata) applicationTag è il tag relativa ai dati sensibili (ad esempio < 746F746F>)

seguenti luoghi:

  • Il problema si verifica solo con i dispositivi a 64 bit, non è un problema con i dispositivi a 32 bit.
  • Sostituire CSSM_ALGID_AES da CSSM_ALGID_NONE risolve il problema (cioè i dati creati con iOS 9.1 possono essere recuperati correttamente con iOS 9.2 beta 3), ma non è accettabile perché devo essere in grado di leggere i dati creati su iOS 9.1 con CSSM_ALGID_AES.
  • Il problema non è correlato a kSecAttrAccessGroup: ho ancora il problema quando rimuovo questa proprietà.
  • Ho "riprodotto" il problema con il campione di Apple (https://developer.apple.com/library/ios/samplecode/CryptoExercise). Questo esempio utilizza anche CSSM_ALGID_AES e non kSecAttrAccessGroup. Usando il dispositivo a 64 bit: una chiave creata con iOS 9.1 (< bdd17fe1 f515e2b1 14de7c43 c4cb6a70>) viene trovata con iOS 9.2 beta 3 ma ha un valore diverso (e32b10 73b205e2 46230f69 fa0f347c 2958e6b1>) !! Utilizzando dispositivo a 32 bit: chiave è lo stesso tra iOS 9.1 e iOS 9.2 beta 3.

Note:

  • ho già postato questa domanda sul forum di Apple ma nessuna risposta da parte di Apple ... https://forums.developer.apple.com/message/87080
  • Passaggio tra iOS 9.1 e 9.2 beta 3 utilizzando i file IPSW senza eseguire un ripristino di backup, ma ho lo stesso problema eseguendo il ripristino di backup.

Qualche idea?

risposta

0

Ho lo stesso problema su iOS9.2 ufficiale, posso riprodurlo su qualsiasi dispositivo, testato con iPhone 6, iPhone 5S e iPad Pro.

Nessun problema su un iPhone 4S e iPad mini, l'ho verificato con ogni dispositivo.

Problemi correlati