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?