2015-11-13 19 views
5

के साथ errSecItemNotFound मैं एक संवेदनशील डेटा स्टोर करने के लिए कीचेन का उपयोग करता हूं।आईओएस कीचेन - आईओएस 9.2 बीटा 3

आईओएस 9.2 बीटा 3 के बाद से, मैं आईओएस के पिछले संस्करण (जैसे आईओएस 9.1) से बनाए गए एक संवेदनशील डेटा को पुनर्प्राप्त नहीं कर सकता। मुझे SecItemCopyMatching का उपयोग करते समय त्रुटि त्रुटि SSecItemNotFound है। आईओएस 9.1 के साथ कोई समस्या नहीं (न ही आईओएस 9.2 बीटा 2 और न ही आईओएस 7.x/8.x/9.0)।

बहुत अजीब: मेरा स्रोत कोड एक नया संवेदनशील डेटा बनाता है यदि यह अस्तित्व में नहीं है, इसलिए आईओएस 9.2 बीटा 3 के साथ मेरा नया संवेदनशील डेटा है, लेकिन अगर मैं आईओएस 9.1 पर वापस स्विच करता हूं, तो मैं पुराने संवेदनशील डेटा को पुनः प्राप्त करता हूं , और इसलिए जब वापस आईओएस के लिए 9.2 बीटा 3 ... जा रहा पर मैं ठीक उसी क्वेरी का उपयोग के रूप में, यह कीचेन दोहराया गया है लगता है ...

यहाँ एक संवेदनशील डेटा जोड़ने के लिए मेरी कोड है:

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

यहां एक संवेदनशील डेटा प्राप्त करने के लिए मेरा कोड है:

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

कहाँ:

  • sensitiveData दुकान में संवेदनशील डेटा है (उदाहरण के लिए < ac746cc2 80f72948 59d0d8b7 a5de4bad 5d9e9eb1 a400fba3 c85f3f2e 675d58bf>)
  • accessGroup टीम पहचानकर्ता और आवेदन के संयोजन है
  • पहचानकर्ता (जैसे XXXXXXXXXX.com.toto.tata) applicationTag टैग समझदार डेटा से संबंधित है (उदाहरण के < 746F746F>)

अतिरिक्त अंक:

  • समस्या केवल 64-बिट उपकरणों के साथ होता है, 32-बिट डिवाइस के साथ कोई समस्या नहीं है।
  • CSSM_ALGID_NONE द्वारा CSSM_ALGID_AES की जगह इस मुद्दे को हल करती है (अर्थात आईओएस 9.1 के साथ बनाया डेटा ठीक से आईओएस 9.2 बीटा 3 के साथ प्राप्त किया जा सकता है), लेकिन यह स्वीकार्य नहीं है क्योंकि मैं CSSM_ALGID_AES साथ आईओएस 9.1 पर बनाए गए डेटा को पढ़ने के लिए सक्षम होना चाहिए।
  • यह समस्या kSecAttrAccessGroup से संबंधित नहीं है: जब भी मैं इस संपत्ति को हटाता हूं तब भी मुझे समस्या है।
  • मैंने ऐप्पल (https://developer.apple.com/library/ios/samplecode/CryptoExercise) से नमूना के साथ इस मुद्दे को "पुन: उत्पन्न" किया है। यह नमूना CSSM_ALGID_AES का भी उपयोग करता है और kSecAttrAccessGroup नहीं। 64-बिट डिवाइस का उपयोग करना: आईओएस 9.1 (< bdd17fe1 f515e2b1 14de7c43 c4cb6a70>) के साथ बनाई गई कुंजी आईओएस 9.2 बीटा 3 के साथ मिलती है लेकिन इसका एक अलग मूल्य है (< 73b205e2 46230f69 fa0f347c 2 9 58e6b1>) !! 32-बिट डिवाइस का उपयोग करना: कुंजी आईओएस 9.1 और iOS 9.2 बीटा 3.

नोट्स के बीच में ही है:

  • मैं पहले से ही एप्पल मंच पर इस प्रश्न पोस्ट लेकिन एप्पल से कोई जवाब नहीं ... https://forums.developer.apple.com/message/87080
  • मैं बैकअप पुनर्स्थापित किए बिना आईपीएसएस फ़ाइलों का उपयोग करके आईओएस 9.1 और 9.2 बीटा 3 के बीच स्विच करता हूं, लेकिन मुझे बैकअप पुनर्स्थापित करके एक ही समस्या है।

कोई विचार?

उत्तर

0

मुझे आईओएस 9.2 आधिकारिक पर एक ही समस्या है, मैं इसे किसी भी डिवाइस पर पुन: पेश कर सकता हूं, आईफोन 6, आईफोन 5 एस और आईपैड प्रो के साथ परीक्षण किया जा सकता है।

आईफोन 4 एस और आईपैड मिनी पर कोई समस्या नहीं, मैंने इसे प्रत्येक डिवाइस के साथ सत्यापित किया।

संबंधित मुद्दे