ऐप की सुरक्षा का पहला नियम: कोई भी मशीन, जिसके लिए एक हमलावर को अप्रतिबंधित भौतिक या इलेक्ट्रॉनिक पहुंच प्राप्त होती है, वह अब आपके हमलावर से संबंधित है, भले ही वह वास्तव में वह स्थान हो या आपने उसके लिए भुगतान किया हो।
ऐप सुरक्षा का दूसरा नियम: कोई भी सॉफ़्टवेयर जो भौतिक सीमाओं को छोड़ देता है जिसके अंदर एक हमलावर घुस नहीं सकता है अब आपके हमलावर के अंतर्गत आता है, भले ही आपने इसे कोड करने में कितना समय बिताया हो।
तीसरा नियम: कोई भी जानकारी जो उन्हीं भौतिक सीमाओं को छोड़ती है जो एक हमलावर में प्रवेश नहीं कर सकती है वह आपके हमलावर से संबंधित है, चाहे वह आपके लिए कितना भी मूल्यवान क्यों न हो।
सूचना प्रौद्योगिकी सुरक्षा की नींव इन तीन मूलभूत सिद्धांतों पर आधारित हैं; एकमात्र सही मायने में सुरक्षित कंप्यूटर एक सुरक्षित है, जो एक फ़राडे पिंजरे के अंदर, एक स्टील के पिंजरे के अंदर बंद है। ऐसे कंप्यूटर हैं जो अपनी अधिकांश सेवा बस इसी अवस्था में बिताते हैं; वर्ष में एक बार (या उससे कम), वे विश्वसनीय रूट प्रमाणन अधिकारियों के लिए निजी कुंजी उत्पन्न करते हैं (गवाहों के एक मेजबान के सामने, जिसमें वे जिस कमरे में स्थित हैं, उसके हर इंच की रिकॉर्डिंग कैमरों के साथ करते हैं)।
अब, अधिकांश कंप्यूटर इन प्रकार के वातावरण में उपयोग नहीं किए जाते हैं; वे शारीरिक रूप से खुले में बाहर हैं, एक वायरलेस रेडियो चैनल पर इंटरनेट से जुड़ा हुआ है। संक्षेप में, वे असुरक्षित हैं, जैसा कि उनका सॉफ्टवेयर है। इसलिए उन पर भरोसा नहीं किया जाता है। कुछ चीजें हैं जो कंप्यूटर और उनके सॉफ़्टवेयर को उपयोगी होने के लिए पता होना चाहिए या करना चाहिए, लेकिन यह सुनिश्चित करने के लिए ध्यान रखा जाना चाहिए कि वे कभी भी नुकसान का कारण जानने के लिए या पर्याप्त नहीं कर सकते (कम से कम उस एकल मशीन की सीमा के बाहर स्थायी क्षति नहीं। )।
आप यह सब पहले से ही जानते थे; इसीलिए आप अपने एप्लिकेशन के कोड को सुरक्षित रखने का प्रयास कर रहे हैं। लेकिन, इसमें पहली समस्या है; ओफ़्फ़्यूसिएशन टूल एक मानव के लिए कोड को गड़बड़ी करने की कोशिश कर सकते हैं, लेकिन कार्यक्रम अभी भी चलना है; इसका मतलब है कि ऐप का वास्तविक तर्क प्रवाह और इसके द्वारा उपयोग किए जाने वाले डेटा को अप्रभाव से अप्रभावित किया जाता है। थोड़े तप को देखते हुए, एक हमलावर कोड को अन-ऑबफ्यूकेट कर सकता है, और कुछ मामलों में यह आवश्यक भी नहीं है कि वह जो देख रहा है वह कुछ और नहीं हो सकता है, लेकिन वह क्या देख रहा है।
इसके बजाय, आपको यह सुनिश्चित करने की कोशिश करनी चाहिए कि कोई हमलावर आपके कोड के साथ कुछ भी नहीं कर सकता है, फिर चाहे उसके लिए यह कितना भी आसान क्यों न हो, उसे इसकी एक स्पष्ट प्रति प्राप्त करनी होगी। इसका मतलब है कि, कोई हार्ड-कोडेड रहस्य नहीं है, क्योंकि कोड के भवन से बाहर निकलते ही वे रहस्य गुप्त नहीं रह जाते हैं।
आपके द्वारा हार्ड-कोड किए गए इन कुंजी-मूल्यों को पूरी तरह से एप्लिकेशन के स्रोत कोड से हटा दिया जाना चाहिए। इसके बजाय, उन्हें तीन स्थानों में से एक में होना चाहिए; डिवाइस पर वाष्पशील मेमोरी, जो एक हमलावर को ऑफ़लाइन प्रतिलिपि प्राप्त करने के लिए कठिन (लेकिन अभी भी असंभव नहीं है); स्थायी रूप से सर्वर क्लस्टर पर, जिस पर आप लोहे की मुट्ठी के साथ पहुंच को नियंत्रित करते हैं; या आपके डिवाइस या सर्वर से असंबंधित किसी दूसरे डेटा स्टोर में, जैसे कि एक भौतिक कार्ड या आपके उपयोगकर्ता की यादों में (मतलब यह अंततः वाष्पशील मेमोरी में होगा, लेकिन यह लंबे समय तक नहीं होना चाहिए)।
निम्नलिखित योजना पर विचार करें। उपयोगकर्ता डिवाइस में मेमोरी से ऐप के लिए अपनी साख दर्ज करता है। आपको, दुर्भाग्य से, विश्वास करना चाहिए कि उपयोगकर्ता के डिवाइस में पहले से ही एक कीलॉगर या ट्रोजन द्वारा समझौता नहीं किया गया है; इस संबंध में सबसे अच्छा आप बहु-कारक सुरक्षा को लागू कर सकते हैं, उपयोगकर्ता द्वारा उपयोग किए जाने वाले उपकरणों (मैक / आईपी, आईएमईआई, आदि) के बारे में कठिन-से-नकली पहचान को याद करके और कम से कम एक अतिरिक्त चैनल प्रदान करना। जो किसी अपरिचित डिवाइस पर लॉगिन प्रयास को सत्यापित कर सकता है।
एक बार दर्ज किए गए क्रेडेंशियल क्लाइंट सॉफ़्टवेयर (एक सुरक्षित हैश का उपयोग करके) से बाधित होते हैं, और सादे-पाठ क्रेडेंशियल्स को छोड़ दिया जाता है; उन्होंने अपना उद्देश्य पूरा किया है। ओफ़्फ़ुसेटेड क्रेडेंशियल्स को सर्टिफाइड-ऑथेंटिकेटेड सर्वर को एक सुरक्षित चैनल पर भेजा जाता है, जो लॉगिन की वैधता को सत्यापित करने के लिए उपयोग किए गए डेटा का उत्पादन करने के लिए उन्हें फिर से हैश करता है । इस तरह, क्लाइंट को यह कभी नहीं पता होता है कि डेटाबेस वैल्यू की तुलना में वास्तव में क्या है, ऐप सर्वर को सत्यापन के लिए जो भी प्राप्त होता है उसके पीछे के प्लेनटेक्स्ट क्रेडेंशियल्स को कभी नहीं पता होता है, डेटा सर्वर को कभी नहीं पता होता है कि वह डेटा जो सत्यापन के लिए संग्रहीत करता है, और एक आदमी कैसे बनता है यदि सुरक्षित चैनल से समझौता किया गया था तो भी मध्य केवल अस्पष्ट दिखाई देता है।
एक बार सत्यापित हो जाने के बाद, सर्वर चैनल पर एक टोकन वापस भेजता है। टोकन केवल सुरक्षित सत्र के भीतर उपयोगी है, या तो यादृच्छिक शोर से बना है या सत्र पहचानकर्ताओं की एक एन्क्रिप्टेड (और इस तरह से सत्यापित) प्रति है, और क्लाइंट एप्लिकेशन को किसी भी अनुरोध के हिस्से के रूप में इस टोकन को सर्वर पर भेजना होगा। कुछ करने के लिए। क्लाइंट एप्लिकेशन कई बार ऐसा करेगा, क्योंकि यह पैसे, संवेदनशील डेटा, या ऐसी किसी भी चीज़ को शामिल नहीं कर सकता है जो स्वयं के लिए हानिकारक हो सकती है; इसके बजाय सर्वर को यह कार्य करने के लिए कहना चाहिए। क्लाइंट एप्लिकेशन डिवाइस पर लगातार मेमोरी के लिए कोई संवेदनशील जानकारी कभी नहीं लिखेगा, कम से कम सादे पाठ में नहीं; क्लाइंट किसी भी स्थानीय डेटा को एन्क्रिप्ट करने के लिए एक सममित कुंजी के लिए सुरक्षित चैनल पर सर्वर से पूछ सकता है, जिसे सर्वर याद रखेगा; बाद के सत्र में क्लाइंट सर्वर से उसी कुंजी के लिए अस्थिर मेमोरी में उपयोग के लिए डेटा को डिक्रिप्ट करने के लिए कह सकता है। वह डेटा केवल कॉपी नहीं होगा; कुछ भी ग्राहक भंडार को सर्वर में किसी रूप में प्रेषित किया जाना चाहिए।
जाहिर है, यह आपके एप्लिकेशन को इंटरनेट एक्सेस पर बहुत अधिक निर्भर करता है; क्लाइंट डिवाइस सर्वर द्वारा उचित कनेक्शन और प्रमाणीकरण के बिना अपने किसी भी बुनियादी कार्य को नहीं कर सकता है। फेसबुक से अलग नहीं, सच में।
अब, कंप्यूटर जो हमलावर चाहता है, वह आपका सर्वर है, क्योंकि यह नहीं है और क्लाइंट ऐप / डिवाइस वह चीज है जो उसे पैसा दे सकती है या अन्य लोगों को उसके आनंद के लिए दर्द का कारण बना सकती है। ठीक है; आप अपने रुपये खर्च करने के पैसे और सर्वर को सुरक्षित करने के प्रयास में सभी ग्राहकों को सुरक्षित करने की तुलना में बहुत अधिक धमाकेदार हैं। सर्वर सभी प्रकार के फायरवॉल और अन्य इलेक्ट्रॉनिक सुरक्षा के पीछे हो सकता है, और इसके अलावा स्टील, कंक्रीट, कीकार्ड / पिन एक्सेस और 24 घंटे की वीडियो निगरानी के साथ भौतिक रूप से सुरक्षित किया जा सकता है। सर्वर पर किसी भी तरह की पहुंच हासिल करने के लिए आपके हमलावर को वास्तव में बहुत परिष्कृत होना चाहिए, और आपको इसके बारे में तुरंत पता होना चाहिए।
एक हमलावर जो सबसे अच्छा कर सकता है वह है उपयोगकर्ता के फोन और क्रेडेंशियल्स को चोरी करना और क्लाइंट के सीमित अधिकारों के साथ सर्वर में लॉग इन करना। क्या ऐसा होना चाहिए, क्रेडिट कार्ड खोने की तरह, वैध उपयोगकर्ता को 800 नंबर पर कॉल करने का निर्देश दिया जाना चाहिए (अधिमानतः याद रखना आसान है, और कार्ड के पीछे वे अपने पर्स, बटुए या ब्रीफकेस में नहीं ले जा सकते हैं, जो हो सकता है मोबाइल डिवाइस के साथ चोरी) किसी भी फोन से वे एक्सेस कर सकते हैं जो उन्हें सीधे आपकी ग्राहक सेवा से जोड़ता है। वे कहते हैं कि उनका फोन चोरी हो गया था, कुछ मूल अद्वितीय पहचानकर्ता प्रदान करते हैं, और खाता बंद कर दिया जाता है, हमलावर किसी भी लेनदेन को संसाधित करने में सक्षम हो सकते हैं और वापस हमलावर को वर्ग एक में बदल सकते हैं।