2008-10-10 14 views
29

This question discusses encrypting data on the iPhone। एक विकल्प के रूप में, क्या आईफोन पर एक कीचेन है और यदि हां, तो लॉगिन विवरण स्टोर करने के लिए मैं इसका उपयोग करने के लिए किस कोड का उपयोग करूंगा और फिर उन्हें एप्लिकेशन में हमारे लिए पुनर्प्राप्त कर सकता हूं?क्या मैं आईफोन पर कीचेन एक्सेस कर सकता हूं? क्रिप्ट() फ़ंक्शन का उपयोग करके

GenericKeychain sample

उत्तर

34

कीचेन आप उपयोग कर सकते हैं कोड के लिए, सबसे अच्छा शर्त एप्पल से GenericKeychain नमूना आवेदन की जाँच करने के लिए है एक ही कीचेन जानकारी तक पहुंचने के लिए एक आवेदन से, आपको एक वाइल्ड कार्ड एपआईडी (#####। com.prefix। *) उत्पन्न करना होगा ...

+1

उनका कहना है कि बाहर के लिए धन्यवाद है! – maralbjo

5

भी याद रखें कि एक AppID, पैदा आप और अधिक चाहते हैं: -

44

ध्यान देने योग्य एक और बात: कीचेन एपीआई नहीं आईफोन एसडीके के पुराने संस्करण (2.x, 3.x) का उपयोग करते समय सिम्युलेटर में काम करें। परीक्षण करते समय यह आपको बहुत निराशा बचा सकता है!

+0

यह थोड़ी देर के लिए तय किया गया है। यह सिम्युलेटर में मेरे लिए काम करता है। – bartvdpoel

+0

हां, अब यह सिम में काम करता है। मुझे विश्वास है कि यह 3.x रिलीज में तय किया गया था। –

8

मुझे वास्तव में Buzz Anderson's Keychain abstraction layer पसंद है और मैं उत्सुकतापूर्वक Jens Alfke's MYCrypto का उपयोग करने योग्य राज्य तक पहुंचने का इंतजार कर रहा हूं। उत्तरार्द्ध एक ही कोड का उपयोग कर मैक ओएस एक्स और आईफोन पर उपयोग की इजाजत देने का एक सक्षम काम करता है, हालांकि इसकी विशेषताएं केवल कीचेन के एक छोटे से सबसेट की नकल करती हैं।

4

जेनेरिककेचैन नमूना के नवीनतम संस्करण 1.2 के साथ ऐप्पल एक कीचेन रैपर प्रदान करता है जो आईफोन सिम्युलेटर पर भी चलता है। विवरण के लिए इस आलेख पर देखें: http://dev-metal.blogspot.com/2010/08/howto-use-keychain-in-iphone-sdk-to.html

8

मैं कुंजीपटल में कुंजी/वैल्यू जोड़े को स्टोर करने के लिए उपयोग करता हूं। अपनी परियोजना

#import <Security/Security.h> 

// ------------------------------------------------------------------------- 
-(NSString *)getSecureValueForKey:(NSString *)key { 
    /* 

    Return a value from the keychain 

    */ 

    // Retrieve a value from the keychain 
    NSDictionary *result; 
    NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecReturnAttributes, nil] autorelease]; 
    NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, kCFBooleanTrue, nil] autorelease]; 
    NSDictionary *query = [[NSDictionary alloc] initWithObjects: objects forKeys: keys]; 

    // Check if the value was found 
    OSStatus status = SecItemCopyMatching((CFDictionaryRef) query, (CFTypeRef *) &result); 
    [query release]; 
    if (status != noErr) { 
     // Value not found 
     return nil; 
    } else { 
     // Value was found so return it 
     NSString *value = (NSString *) [result objectForKey: (NSString *) kSecAttrGeneric]; 
     return value; 
    } 
} 




// ------------------------------------------------------------------------- 
-(bool)storeSecureValue:(NSString *)value forKey:(NSString *)key { 
    /* 

    Store a value in the keychain 

    */ 

    // Get the existing value for the key 
    NSString *existingValue = [self getSecureValueForKey:key]; 

    // Check if a value already exists for this key 
    OSStatus status; 
    if (existingValue) { 
     // Value already exists, so update it 
     NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, nil] autorelease]; 
     NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, nil] autorelease]; 
     NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; 
     status = SecItemUpdate((CFDictionaryRef) query, (CFDictionaryRef) [NSDictionary dictionaryWithObject:value forKey: (NSString *) kSecAttrGeneric]); 
    } else { 
     // Value does not exist, so add it 
     NSArray *keys = [[[NSArray alloc] initWithObjects: (NSString *) kSecClass, kSecAttrAccount, kSecAttrGeneric, nil] autorelease]; 
     NSArray *objects = [[[NSArray alloc] initWithObjects: (NSString *) kSecClassGenericPassword, key, value, nil] autorelease]; 
     NSDictionary *query = [[[NSDictionary alloc] initWithObjects: objects forKeys: keys] autorelease]; 
     status = SecItemAdd((CFDictionaryRef) query, NULL); 
    } 

    // Check if the value was stored 
    if (status != noErr) { 
     // Value was not stored 
     return false; 
    } else { 
     // Value was stored 
     return true; 
    } 
} 

यह ध्यान देने योग्य है कि इन कुंजी/मान उपयोगकर्ता ने आपके ऐप को हटा देता है यदि नहीं हटेंगे लायक है के लिए Security.framework जोड़ने के लिए सुनिश्चित करें। यदि कोई उपयोगकर्ता आपके ऐप को हटा देता है, तो उसे फिर से इंस्टॉल करता है, तो कुंजी/मान अभी भी पहुंच योग्य होंगे।

+0

यह कोड मेरे लिए आईओएस 4.3 – AlBeebe

+2

चलाने वाले सिम्युलेटर पर मेरे लिए ठीक काम करता है चयनकर्ता getSecureValueForKey में एक बग है: जब आप मान वापस करते हैं, तो यह पहले ही रिलीज़ हो चुका है। इसे "[परिणाम रिलीज] द्वारा जारी किया गया है;" –

+0

मैंने उद्देश्य-सी विधियों के बजाय सी फ़ंक्शन के रूप में संशोधित किया। मेरे मामले में, मैं इस कार्यक्षमता को अपने ऐप पर किसी ऑब्जेक्ट पर उपलब्ध करना चाहता हूं, और कार्यक्षमता को किसी भी प्रकार के लगातार भंडारण (ivars) की आवश्यकता नहीं होती है। लेकिन अन्यथा, महान स्निपेट! –

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

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