2013-06-04 5 views
6

ऐप्पल जेनेरिककेचैन नमूना में कीचेनइटमवेपर क्लास पासवर्ड स्टोर करने के लिए kSecValueData कुंजी का उपयोग करें।आईओएस कीचेन में पासवर्ड स्टोर करने के लिए मुझे किस कुंजी का उपयोग करना चाहिए?

लेकिन संदर्भ http://developer.apple.com/library/ios/#documentation/Security/Reference/keychainservices/Reference/reference.html#//apple_ref/doc/uid/TP30000898

कहते kSecValueData SecItemCopyMatching या SecItemAdd के लिए परिणाम शब्दकोश में प्रयोग किया जाता है, लौटे मूल्यों के प्रकार का संकेत है।

जब मैं SecItem को एक कीचेन आइटम बनाने के लिए कॉल करता हूं तो मुझे किस कुंजी का उपयोग करना चाहिए?

उत्तर

7

आपको पासवर्ड स्टोर करने की कुंजी के रूप में केएसईसीवीयू डेटा का उपयोग करना चाहिए (एनएसडीटा या सीएफडीटाआरफ प्रारूप में)।

संदर्भ इस विषय में थोड़ा अस्पष्ट है, kSecValueData कुंजी आउटपुट कुंजी के साथ-साथ इनपुट कुंजी के रूप में काम करता है। यही है, जब आप एक कीचेन आइटम (SecItemCopyMatching) से पूछते हैं और kSecReturnAttributes कुंजी निर्दिष्ट करते हैं, तो इसका उपयोग करते हैं, इसलिए परिणाम एक शब्दकोश के रूप में वापस कर दिया जाता है, पासवर्ड उस शब्दकोश के kSecValueData कुंजी के अंतर्गत संग्रहीत किया जाएगा। और जब आप कुंजीपैन (SecItemAdd) में कोई आइटम जोड़ते हैं तो आप इसका उपयोग भी करते हैं, विधि को कॉल करने से पहले kSecValueData कुंजी में अपने पासवर्ड के NSData या CFDataRef मान को संग्रहीत करते हैं।

प्राप्त कर रहा है पासवर्ड:

NSMutableDictionary *queryDictionary = [[NSMutableDictionary alloc] init]; 
[queryDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass]; 
[queryDictionary setObject:service forKey:kSecAttrService]; 
[queryDictionary setObject:account forKey:kSecAttrAccount]; 
// The result will be a dictionary containing the password attributes... 
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnAttributes)]; 
// ...one of those attributes will be a kSecValueData with the password 
[queryDictionary setObject:YES forKey:(__bridge id<NSCopying>)(kSecReturnData)]; 
OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)(queryDictionary), (CFTypeRef *)&result); 
if (sanityCheck != noErr) 
{ 
    NSDictionary * resultDict = (__bridge NSDictionary *)result; 
    // here's the queried password value 
    NSData *passwordValue = [resultDict objectForKey:(__bridge id)(kSecValueData)]; 
} 

जोड़ना पासवर्ड:

NSString *passwordString = @"my password value"; 
NSData *passwordData = [passwordString dataUsingEncoding:NSUTF8StringEncoding]; 
CFDictionaryRef result = nil; 
NSMutableDictionary *addDictionary = [[NSMutableDictionary alloc] init]; 
[addDictionary setObject: (__bridge id)kSecClassGenericPassword forKey: (__bridge id<NSCopying>)kSecClass]; 
[addDictionary setObject:service forKey:kSecAttrService]; 
[addDictionary setObject:account forKey:kSecAttrAccount]; 

// here goes the password value 
[addDictionary setObject:passwordData forKey:(__bridge id<NSCopying>)(kSecValueData)]; 

OSStatus sanityCheck = SecItemAdd((__bridge CFDictionaryRef)(queryDictionary), NULL) 
if (sanityCheck != noErr) 
{ 
    // if no error the password got successfully stored in the keychain 
} 
+0

बेहतर कोड, कम कीड़े, यहाँ के साथ:

यहाँ दोनों ही मामलों का एक उदाहरण है http://stackoverflow.com/questions/19284063/secitemcopymatching-returns-nil-data –

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

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