2015-11-13 6 views
5

Ich benutze den Schlüsselbund, um eine sensible Daten zu speichern.iOS Schlüsselbund - errSecItemNotFound mit iOS 9.2 beta 3

Seit iOS 9.2 Beta 3 kann ich keine vertraulichen Daten abrufen, die mit einer früheren iOS-Version (z. B. iOS 9.1) erstellt wurden. Ich habe einen Fehler errSecItemNotFound bei Verwendung von SecItemCopyMatching. Kein Problem mit iOS 9.1 (noch iOS 9.2 Beta 2 und iOS 7.x/8.x/9.0).

Sehr seltsam: mein Quellcode erstellt eine neue sensible Daten, wenn es nicht existiert, so mit iOS 9.2 Beta 3 habe ich eine neue sensible Daten, aber wenn ich zurück zu iOS 9.1, ich die alten sensiblen Daten abrufen und so weiter, wenn auf iOS 9.2 beta 3 zurück ... Wie ich genau die gleiche Abfrage verwenden, so scheint es, der Schlüsselbund dupliziert ...

Hier mein Code ist ein sensible Daten hinzuzufügen:

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

Hier ist mein Code, um eine sensible Daten zu erhalten:

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

Wo:

  • sensitiveData die sensitiven Daten zu speichern (z.B. < ac746cc2 80f72948 59d0d8b7 a5de4bad 5d9e9eb1 a400fba3 c85f3f2e 675d58bf>)
  • accessGroup ist die Verkettung von Teamkennung und Anwendungs ​​
  • Identifikator (zB XXXXXXXXXX.com.toto.tata) applicationTag wird der Tag mit den sensiblen Daten bezogen (zB < 746F746F>)

Weitere Punkte:

  • Das Problem tritt mit 64-Bit-Geräten nur, kein Problem mit 32-Bit-Geräten.
  • Das Ersetzen von CSSM_ALGID_AES durch CSSM_ALGID_NONE löst das Problem (d. H. Daten, die mit iOS 9.1 erstellt wurden, können mit iOS 9.2 Beta 3 korrekt abgerufen werden), aber es ist nicht akzeptabel, da ich in iOS 9.1 erstellte Daten mit CSSM_ALGID_AES lesen kann.
  • Das Problem bezieht sich nicht auf kSecAttrAccessGroup: Ich habe immer noch das Problem, wenn ich diese Eigenschaft entfernen.
  • Ich habe das Problem mit Probe von Apple "reproduziert" (https://developer.apple.com/library/ios/samplecode/CryptoExercise). In diesem Beispiel wird CSSM_ALGID_AES und nicht kSecAttrAccessGroup verwendet. 64-Bit-Gerät verwenden: Ein mit iOS 9.1 erstellter Schlüssel (< bdd17fe1 f515e2b1 14de7c43 c4cb6a70>) wurde mit iOS 9.2 beta 3 gefunden, hat aber einen anderen Wert (< 73b205e2 46230f69 fa0f347c 2958e6b1>) !! Mit 32-Bit-Gerät: Taste die gleiche zwischen iOS 9.1 und iOS 9.2 Beta 3.

Hinweise:

  • Ich stellte diese Frage bereits im Apple Forum, aber keine Antwort von Apple ... https://forums.developer.apple.com/message/87080
  • Ich wechsle zwischen iOS 9.1 und 9.2 Beta 3 mit IPSW-Dateien, ohne eine Backup-Wiederherstellung, aber ich habe das gleiche Problem, indem Sie Backup-Wiederherstellung.

Irgendeine Idee?

Antwort

0

Ich habe das gleiche Problem auf iOS9.2 offiziell, ich kann dies auf jedem Gerät reproduzieren, getestet mit iPhone 6, iPhone 5S und iPad Pro.

Kein Problem auf einem iPhone 4S und iPad mini, ich habe dies mit jedem Gerät verifiziert.

Verwandte Themen