2009-04-14 11 views
7

मुझे NSString ऑब्जेक्ट्स में पासवर्ड स्टोर करने की आवश्यकता है; हालांकि, मैं उन्हें खराब करने का कोई तरीका चाहूंगा, इसलिए उन्हें सीधे स्मृति से नहीं पढ़ा जा सकता है।स्मृति में पढ़ने योग्य होने के बिना एनएसएसटींग में एक पासवर्ड संग्रहीत करना

यह एक मैक ओएस एक्स (10.5) एप्लिकेशन है, लेकिन एक समाधान जो आईफोन पर भी काम करता है, उसकी बहुत सराहना की जाएगी।

+0

आपको विशेष रूप से उन्हें एक स्ट्रिंग में स्टोर करने की आवश्यकता क्यों है और लोग उस स्मृति को प्राप्त करने का प्रयास क्यों कर रहे हैं? –

उत्तर

12

यदि आप पासवर्ड संग्रहीत करने के लिए कीचेन का उपयोग करते हैं तो आपके चारों ओर तारों को पार करने के बजाय अपारदर्शी कीचेन SecKeychainItemRefs को संभाला जा सकता है, केवल उस बिंदु पर सादे टेक्स्ट को पुनर्प्राप्त कर सकता है जहां इसकी आवश्यकता होती है। मैक उपयोगकर्ता भी अपने पासवर्ड से निपटने की अपेक्षा करते हैं। दुर्भाग्य से यह जानने के बिना कि आपको "NSString ऑब्जेक्ट्स में पासवर्ड स्टोर करने की आवश्यकता क्यों है" मैं यह नहीं बता सकता कि यह वास्तव में सच है :-)

3

क्या आप उन्हें एनएसएसटींग में रखने से पहले उन्हें md5 नहीं कर सका? फिर जब आप परीक्षण करने के लिए जाते हैं, इनपुट स्ट्रिंग md5 और उस चीज़ की तुलना करें जो संग्रहीत है?

+0

जो किसी को भी उन्हें पढ़ने से नहीं रोकता है। – Chuck

+0

सच है।लेकिन आप प्रमाणीकरण के लिए md5 स्ट्रिंग या जो भी पासवर्ड उपयोग कर रहे हैं, उसका उपयोग करने में सक्षम नहीं होंगे। – Ronald

+0

यह उन्हें पासवर्ड पढ़ने से रोक देगा लेकिन हैश तक पहुंच की अनुमति देगा जो अलग है। –

3

आईफोन पर, सैंडबॉक्स किसी को भी आपके पासवर्ड तक पहुंचने से रोक देगा। डेस्कटॉप पर यह इतना आसान नहीं है।

आपको पासवर्ड को cleartext के बजाय हैंश के रूप में स्टोर करना चाहिए। मेरा मानना ​​है कि इससे आपको कार्यक्षमता प्रभावित किए बिना परिणाम मिलेंगे। एकमात्र ऐसा लगता है कि आप कभी भी करने में सक्षम नहीं होंगे, फिर से क्लीयरक्स्ट पासवर्ड तक पहुंचें - यदि आप इसे ताकत के लिए विश्लेषण करना चाहते हैं या इसे किसी अन्य सेवा पर पास करना चाहते हैं। सामान्य रूप से, हैश कार्यक्षमता बलिदान नहीं करेंगे।

निम्नलिखित कोड rawPassword में एक पासवर्ड लेता है और पासवर्ड में SHA-1 हैश स्टोर करता है।

#import <CommonCrypto/CommonDigest.h> 

const char* utf8PasswordRepresentation = [rawPassword UTF8String]; 
unsigned char * rawHash = malloc(CC_SHA1_DIGEST_LENGTH); 

CC_SHA1(utf8PasswordRepresentation, strlen(utf8PasswordRepresentation), rawHash); 

NSMutableString* passwordHash = [NSMutableString CC_SHA1_DIGEST_LENGTH*2]; 
for (int i = 0 ; i< CC_SHA1_DIGEST_LENGTH; i++) 
    [passwordHash appendFormat:@"%02x" , rawHash[i]]; 

ध्यान दें कि यहां कोई मेमोरी प्रबंधन नहीं है।

explanation of password hashing के लिए विकिपीडिया प्रविष्टि देखें।

इंटरबेट के आसपास इस कोड के कई संस्करण हैं।

+0

आपने स्ट्रिंग विथ कैपेसिटी को याद किया: लाइन 8 – nico

1

एक करने के लिए और कीचेन से भंडारण और पासवर्ड पुन: प्राप्त करने के लिए कोड का बहुत ही उपयोगी सेट यहां पाया जा सकता है:

http://log.scifihifi.com/post/55837387/simple-iphone-keychain-code

मैं इसे का उपयोग किया है, और यह अच्छी तरह से काम किया।

2

मुझे लगता है कि पोस्टर स्मृति में पासवर्ड को खराब करने का जिक्र कर रहा है, इसलिए आप स्मृति के बाहर ivar की सामग्री को पढ़ नहीं सकते हैं। Google की GData लाइब्रेरी में XORING पासवर्ड के लिए कुछ उपयोगी कोड है जो उदाहरण के चर में NSMutableData के रूप में संग्रहीत हैं।

source for GDataServiceBase.m

// XorPlainMutableData is a simple way to keep passwords held in heap objects 
// from being visible as plain-text 
static void XorPlainMutableData(NSMutableData *mutable) { 

    // this helps avoid storing passwords on the heap in plaintext 
    const unsigned char theXORValue = 0x95; // 0x95 = 0xb10010101 

    unsigned char *dataPtr = [mutable mutableBytes]; 
    NSUInteger length = [mutable length]; 

    for (NSUInteger idx = 0; idx < length; idx++) { 
     dataPtr[idx] ^= theXORValue; 
    } 
} 

आप/बचाने XOR का उपयोग कर पासवर्ड को बहाल कर सकते हैं (#password और #setUserCredentialsWithUsername: पासवर्ड: एक ही फाइल में विधि)। एक्सओआर उच्च तकनीक एन्क्रिप्शन नहीं है, लेकिन यह आरामदायक स्नूपिंग रोकने के लिए पर्याप्त है। जीडीएटी क्लाइंट के मामले में जहां आपके पास एक ऐसे एप्लिकेशन में दीर्घकालिक सेवा/प्रबंधक ऑब्जेक्ट हो सकता है जो पासवर्ड डेटा के संदर्भ को बरकरार रखता है, मुझे लगता है कि यह एक उचित दृष्टिकोण है।

+0

धन्यवाद ब्रायन, मूल रूप से यही वह बात है जिसका मैं जिक्र कर रहा था लेकिन ग्राहम ली का जवाब मेरी समस्या को बेहतर ढंग से हल करता है। लेकिन यह भी बहुत उपयोगी +1 है – rjstelling