2012-05-10 8 views
5

में एन्क्रिप्शन कुंजी को सहेजने का सुरक्षित तरीका मेरे आईओएस 4 + ऐप में मैं कई स्थानों पर एईएस एन्क्रिप्शन का उपयोग करता हूं और पूरे ऐप को बहुत सुरक्षित होना चाहिए। ऐसा करने के लिए मुझे इस ऐप में कई कुंजियों को कड़ी मेहनत करनी है, जिन्हें मुझे कुछ एन्क्रिप्ट करने की आवश्यकता होने पर यादृच्छिक रूप से चुना जाता है ...आईओएस

मेरा प्रश्न यह है कि उन निजी कुंजी को कैसे स्टोर किया जाए? क्या NSString का उपयोग करके उन्हें हार्ड-कोड करना सुरक्षित है? या

#define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9" 

यदि उपयोगकर्ता इस ऐप के साथ आईफोन को जेलबैक करता है, तो क्या वह उन हार्ड-कोड वाली कुंजी नहीं प्राप्त कर सकता था? मैं उन्हें सबसे प्रभावी ढंग से कैसे छुपा सकता हूं?

किसी भी सुझाव के लिए धन्यवाद ...

उत्तर

4

क्या दूसरों क्षुधा कर इससे पहले कि वे एप्लिकेशन का उपयोग कर सकते हैं "में प्रवेश करें" करने के लिए उपयोगकर्ता की आवश्यकता है। फिर आप कुंजीपटल एन्क्रिप्ट करने के लिए कुंजी के रूप में अपने उपयोगकर्ता आईडी/पासवर्ड का उपयोग करते हैं या उस उपयोगकर्ता के लिए कुंजी प्राप्त करने के लिए एक सुरक्षित वेब सेवा का उपयोग करते हैं।

यदि आप #define या यहां तक ​​कि एक एनएसएसटींग का उपयोग करते हैं, तो चाबियाँ अनुमान लगाने के तरीके हैं। जाहिर है, आपको वास्तव में संकलित कोड में उन चाबियों को खोजने के लिए बहुत समय बिताना होगा, लेकिन सुरक्षा के स्तर के आधार पर आप जिन लोगों की तलाश कर रहे हैं और जिन लोगों के खिलाफ आप रक्षा कर रहे हैं, यह एक समस्या हो सकती है।

+0

अच्छी तरह से मैं नहीं कर सकते कुंजी के रूप में जानकारी लॉगिन का उपयोग, बहुत अच्छा होगा, हालांकि :) मैं कई स्थिर कुंजी है, जो hardcoded किया जाएगा की जरूरत है:

यहाँ एक जो लोग सुरक्षित कोड लिखने के लिए की आवश्यकता होगी, कर रहे हैं के लिए अवश्य पढ़ें है। .. लेकिन यह वास्तव में एक अच्छा समाधान हो सकता है - यदि बीमार को 5 चाबियाँ पसंद हैं, तो उनमें से 4 को एन्क्रिप्ट किया जाएगा और मुझे उन्हें पहली कुंजी के साथ डिक्रिप्ट करना होगा और केवल तभी वे क्रिप्टिंग के लिए वैध कुंजी बन जाएंगे ... कोई भी नहीं संकलित कोड में उन चाबियाँ मिलने पर भी असली चाबियाँ मिलेंगी ... धन्यवाद!:) –

+2

यदि आप वास्तव में भद्दा हैं कि आपकी हार्डकोड की गई कुंजियां पढ़ी जा सकती हैं, तो विकल्पों में से एक भी आपकी रूपांतरित कुंजी को स्टोर करना होगा। फिर संग्रहीत कुंजी को वास्तविक कुंजी में बदलने के लिए एक विधि है। उदाहरण के लिए, एक मामूली परिवर्तन रिवर्स स्ट्रिंग होगा। तो यदि आपकी कुंजी एबीसी है, तो आप सीबीए को हार्डकोड करेंगे और हर बार जब आप अपनी कुंजी का उपयोग करना चाहते हैं तो रिवर्स विधि को कॉल करें। बेशक, असली ऐप में, आप बस कुछ विपरीत से थोड़ा अधिक जटिल चाहते हैं। बस एक अतिरिक्त विचार ... – mprivat

+0

बिल्कुल ... ऐसा कुछ वास्तव में ठोस लगता है ... और मैं पागल नहीं हूं, मुझे नहीं लगता कि यह एक बड़ी समस्या है, लेकिन मुझे इसे काम में करना है और वे पागल हैं :) एक बार फिर धन्यवाद! –

2

मैं सुरक्षा पर कुछ लेखों को obfuscation द्वारा पढ़ने की सलाह देता हूं, जो अनिवार्य रूप से आप प्राप्त करने की कोशिश कर रहे हैं (कम से कम यह है कि सभी सिफारिशें क्या कह रही हैं) और आखिरकार सुरक्षित नहीं हैं।

हालांकि, आईओएस की सैंडबॉक्सिंग सुरक्षा का पहला और सबसे प्रभावी रूप है।

दूसरा, इनपुट सत्यापन आपके ऐप की अगली सबसे महत्वपूर्ण सुरक्षा सुविधा होगी। एन्क्रिप्शन को पूरा करने का मतलब कुछ भी नहीं है यदि आप अपने सभी इनपुट (उपयोगकर्ता टाइप की गई जानकारी से, किसी योजना के माध्यम से ऐप लॉन्च करने के लिए नेटवर्क प्रतिक्रियाओं) को मान्य नहीं करते हैं।

अंत में, सुरक्षित एन्क्रिप्शन, जहां यह आवश्यक है, केवल तभी सुरक्षित है जब आप कट्टर नहीं करते हैं (या अपनी हार्ड कोडिंग को खराब करते हैं)। mprivat सही है, आपको उपयोगकर्ता द्वारा उत्पन्न डेटा (एक लॉगिन), एक सार्वजनिक कुंजी एन्क्रिप्शन (इसलिए केवल गैर-शामिल निजी कुंजी डिक्रिप्ट कर सकता है) या सर्वर साइड एन्क्रिप्शन का उपयोग करने की आवश्यकता होगी जो एसएसएल का परिवहन के लिए उपयोग करता है।

मैं यह भी कहूंगा कि यदि आपका सुरक्षित डेटा केवल उस डिवाइस पर बनाए रखा जाना है जिसे आप कीचेन एपीआई का उपयोग करते हैं, और विशेष रूप से सुनिश्चित करें कि आप उस फॉर्म का उपयोग करते हैं जिसके लिए उपयोगकर्ता को पुनर्प्राप्ति के लिए लॉग इन करने की आवश्यकता होती है ।

यदि आपके पास डेटा है जो आप डिवाइस पर एन्क्रिप्ट कर रहे हैं जो डिवाइस और किसी अन्य डिवाइस (सर्वर की तरह) पर डिक्रिप्ट किया गया है, तो आपके पास मौलिक वास्तुशिल्प दोष है। यह काफी महत्वपूर्ण है कि एन्क्रिप्शन-डिक्रिप्शन केवल क्लाइंट-क्लाइंट (उर्फ, उपयोगकर्ता का डिवाइस केवल) या क्लाइंट-सर्वर (जो सर्वर के लिए उपयोगकर्ता डिवाइस या उपयोगकर्ता डिवाइस पर सर्वर हो सकता है) हो। कमजोरियों में दो परिणामों को मिलाकर। क्लाइंट-क्लाइंट बनाम क्लाइंट-सर्वर के लिए एक अलग एन्क्रिप्शन का उपयोग करके, मैं विशेष रूप से वही एन्क्रिप्शन तंत्र का अर्थ हूं (और कभी-कभी आवश्यक)। http://www.amazon.com/gp/aw/d/0735617228