स्रोत कोड में एपीआई कुंजी को छिपाने का सबसे अच्छा तरीका है


12

मुझे एक आवेदन में निजी एपीआई कुंजी की रक्षा करने के बारे में कुछ विचारों की आवश्यकता है, विशेष रूप से एसी # .NET एप्लिकेशन में।

सबसे पहले, मैं समझता हूं कि स्रोत कोड में कुछ भी छिपाना सैद्धांतिक रूप से असंभव है, इसलिए मैं एक और विचार के साथ आया, लेकिन मुझे यकीन नहीं है कि यह कितना प्रशंसनीय है। वैसे भी, निजी कुंजी को सत्यापित करने के लिए किसी वेब सर्वर के साथ संचार करना संभव होगा और फिर यह पुष्टि करने के लिए आवेदन पर वापस बात की जाएगी कि यह एक वैध हाथ है?

मेरे पास काम करने के लिए दो चाबियां हैं: एक सार्वजनिक कुंजी (जैसा कि नाम से पता चलता है, इसे निजी के समान देखभाल के साथ इलाज नहीं करना पड़ता है), और एक निजी कुंजी, जिसे दूसरों से सुरक्षित रखने की आवश्यकता होती है।

मैं ऐसा कैसे कर सकता हूं, इस पर कोई विचार।


4
क्या आप किसी ऐसे व्यक्ति को रोकने की कोशिश कर रहे हैं जिसके पास तैनात द्विआधारी आवेदन की कुंजी पढ़ने से है (जैसा कि आपका शीर्षक पता चलता है), या उन्हें इसे संशोधित करने से बचाएं (जैसा कि सर्वर के माध्यम से सत्यापित करने का आपका विचार है)? अंतिम अंतिम लक्ष्य क्या है?
gregmac

3
इससे अपरिचित पाठकों के लिए एपीआई कुंजी की अवधारणा को रेखांकित करना फायदेमंद हो सकता है । एक एपीआई कुंजी एक सेवा (आमतौर पर एक वेब सेवा) के साथ बातचीत करने वाले कुछ सॉफ़्टवेयर के डेवलपर को प्रदान किया जाने वाला एक रहस्य है। इसका उपयोग ट्रैफ़िक के स्रोत की पहचान करने, प्रतिबंधों बनाम अनाम एक्सेस को उठाने और सेवा उपयोग के लिए कुंजी के स्वामी को बिल करने के लिए किया जाता है। आपसे अपेक्षा की जाती है कि इसे संयमित रूप से छिपा कर रखा जाए और यदि यह समझौता हो जाए तो इसे रद्द कर दें। के रूप में यह पूरी तरह से सेवा में संप्रेषित करने की आवश्यकता है, आप हमेशा खो देते हैं।
लार्स विकलंड

@gregmac हां, मैं एप्लिकेशन के तीसरे पक्ष के उपयोगकर्ताओं को कुंजी पढ़ने से रोकने की कोशिश कर रहा हूं।
स्पेंसर

इसे वहां मत डालें
CodeART

जवाबों:


14

संक्षेप में:

  • आपके पास एक विक्रेता द्वारा जारी की गई एक एपीआई कुंजी है ताकि आप उनके एपीआई का उपयोग कर सकें, और आप का दायित्व है कि आप इस कुंजी को किसी और के लिए जाने से रोकें।
  • आप अपने एप्लिकेशन कोड में उस विक्रेता के एपीआई (जिसे एपीआई कुंजी की आवश्यकता होती है) को कॉल कर रहे हैं
  • आप उन एप्लिकेशन पर सिस्टम को लागू कर रहे हैं, जहां ग्राहकों के पास बायनेरिज़ तक पहुंच है और इस प्रकार कोड को विघटित या बाधित कर सकता है या ट्रैफ़िक रोक सकता है

इस कुंजी के समझौते को रोकने का सबसे अच्छा तरीका है इसका नियंत्रण रखना। इसका मतलब यह है कि इसे कभी भी ऐसे सर्वर पर तैनात नहीं किया जाना चाहिए जहां आपके अलावा कोई भी व्यक्ति बाइनरी को पढ़ सके, और कभी भी आपके द्वारा नियंत्रित नहीं किए जाने वाले संचार लिंक पर न जाए।

अंततः, यदि बायनेरिज़ आपके नियंत्रण से बाहर हैं, तो उनमें सब कुछ आपके नियंत्रण से बाहर है। इसी तरह, यदि कोई ट्रैफ़िक रोक सकता है, तो वे API कुंजी ( संभावित रूप से तब भी जब आप SSL का उपयोग कर रहे हों ) पर कब्जा कर सकते हैं

मैं इसे पूरा करने के लिए दो प्राथमिक तरीके देख सकता हूं, दोनों ही आपके तैनात एप्लिकेशन में आपकी निजी एपीआई कुंजी को शामिल नहीं करते हैं:

प्रत्येक परिनियोजन के लिए एक अद्वितीय API कुंजी प्राप्त करें

इसके लिए विक्रेता के साथ कुछ अतिरिक्त संबंध की आवश्यकता होती है, जहां आप चाबियां प्राप्त कर सकते हैं या अपने ग्राहकों को चाबियां प्राप्त कर सकते हैं।

यह वास्तव में काफी सामान्य है, उदाहरण के लिए, ऐसे उत्पाद जो Google मैप्स एपीआई का उपयोग करते हैं। सॉफ़्टवेयर के निर्माता की अपनी कुंजी होती है जिसका उपयोग वे अपनी कॉपी को विकसित / चलाने के दौरान करते हैं, लेकिन वे इसे सॉफ़्टवेयर में शामिल नहीं करते हैं, और इसके बजाय, आपको उपयोगकर्ता को सॉफ़्टवेयर स्थापित करने, Google पर जाने और अपना स्वयं का API प्राप्त करने की आवश्यकता होती है। चाभी। सॉफ़्टवेयर में Google मानचित्र API कुंजी का उपयोग करने के लिए केवल कॉन्फ़िगरेशन विकल्प होता है।

वास्तव में, एपीआई की कुंजी जारी करने वाले कई विक्रेताओं को आपको इस तरह से काम करने की आवश्यकता होती है, इसलिए आप वैसे भी गलत रास्ते पर जा सकते हैं, और यह एकमात्र समाधान हो सकता है जिसे आप विक्रेता की सेवा की शर्तों के अनुसार उपयोग कर सकते हैं। / या आपके साथ कोई कानूनी अनुबंध हो सकता है।

एक प्रॉक्सी का उपयोग करें

एक प्रॉक्सी एपीआई सेट करें, जहां आपका एप्लिकेशन आपके एपीआई (आपके सर्वर पर) को कॉल करता है, और बदले में, आपका एपीआई कुंजी का उपयोग करके विक्रेता के एपीआई को कॉल करता है।

आपको अपने API पर अतिरिक्त सुरक्षा की आवश्यकता हो सकती है, उदाहरण के लिए, केवल यह सुनिश्चित करने के लिए कि आपका एप्लिकेशन इसका उपयोग कर रहा है। इसके द्वारा किया जा सकता है:

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

यहां ध्यान रखने वाली बात यह है कि आपको ऐसा करने की अनुमति नहीं दी जा सकती है। आपके विक्रेता के पास सेवा की शर्तें या कानूनी अनुबंध हो सकते हैं जो आपको "एकत्रीकरण सेवा" या प्रॉक्सी बनाने से रोकते हैं, इसलिए आपको इसके साथ जांच करने की आवश्यकता है।


दुर्व्यवहार से निपटने

यहां तक ​​कि अगर आपकी कुंजी से समझौता नहीं किया जाता है, अगर आपका कोई ग्राहक कुछ ऐसा कर रहा है, जो विक्रेता को आपकी कुंजी को अवरुद्ध करने का कारण बनता है, तो अचानक आपके सभी ग्राहक अक्षम हो जाते हैं, और आपका एकमात्र फिक्स बाकी सभी को अपडेट करना है।

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

मुट्ठी भर ग्राहकों से परे किसी भी चीज के लिए इसका रसद जल्दी से अस्थिर हो जाएगा।

चाहे आप एक प्रॉक्सी के रूप में कार्य करते हैं या प्रत्येक स्थापना के लिए एक अद्वितीय कुंजी है, आप इनमें से किसी भी स्थिति को अपेक्षाकृत आसानी से संभाल सकते हैं (और किसी और के लिए बहुत कम प्रभाव के साथ)।


कुंजी को सुरक्षित रखने की कोशिश करना, जबकि यह आपके सॉफ्टवेयर में अंतःस्थापित है, अंततः एक निरर्थक प्रयास है। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, कोई भी हमलावर जिसकी बायनेरिज़, सोर्स और / या संचार चैनल तक पहुंच है और यह निर्धारित करने के लिए पर्याप्त है कि वे ऐसा करने में सक्षम होंगे।

तो इसे एम्बेड न करें। "जीतने का एकमात्र कदम नहीं खेलना है।"


2
+1 के लिए "प्रत्येक परिनियोजन के लिए एक अद्वितीय API कुंजी प्राप्त करें।" यहां तक ​​कि प्रॉक्सी के साथ संयोजन के रूप में इस्तेमाल किया जा सकता है, आपको शरारती कुंजी / क्लाइंट को अक्षम करने की एक [सीमित] क्षमता प्रदान करता है।
svidgen

@svidgen बहुत अच्छी बात है, मैंने उस पर चर्चा करते हुए एक खंड जोड़ा। धन्यवाद।
ग्रिग्मैक

1
+1, एक सार्वभौमिक कुंजी लगभग हमेशा आपको ***
व्याट बार्नेट

बहुत गहराई से प्रतिक्रिया। दुर्भाग्य से, मुझे केवल एक निजी एपीआई कुंजी सौंपी गई है, ताकि उपयोगकर्ता को एक कुंजी लाने के लिए कहा जा सके, यह संभव नहीं है, क्योंकि मैं नेटवर्क प्रोटोकॉल के साथ एनडीए के अधीन हूं, इस प्रकार एक निजी कुंजी के लिए कारण। प्रॉक्सी शायद सवाल भी है। मुझे बस किसी तरह इसे गैर-मानव पठनीय प्रारूप में बदलने और स्रोत में कहीं डालने का सहारा लेना पड़ सकता है - एक बढ़िया विकल्प नहीं, लेकिन बहुत सारे विकल्प नहीं हैं।
स्पेन्सर

@ स्पेंसर "प्रॉक्सी शायद यह भी सवाल है" क्यों? यह बेतुका लगता है, और कुंजी वितरित करने से आपके एनडीए का उल्लंघन भी होगा।
एंडी

5

यदि आपके पास ऑब्जेक्ट कोड में एक कुंजी है, तो यह परिभाषा द्वारा सार्वजनिक है। वहाँ obfuscators के आसपास हैक्स है कि जल्दी से कोड वस्तु decompile कर रहे हैं। एक निजी कुंजी ऑब्जेक्ट कोड के बाहर और दूसरी फ़ाइल में होगी। कठिन हिस्सा उपयोगकर्ता को यह निजी कुंजी प्रदान कर रहा है। एक बार यह प्रदान करने के बाद, आप निजी कुंजी के हस्ताक्षर का उपयोग कर सकते हैं, फ़ाइल के अंत में और निजी कुंजी की अखंडता को सत्यापित करने के लिए आवेदन के भीतर एक सार्वजनिक कुंजी। एक वेब सर्वर भी यह सत्यापन कर सकता है, यदि आपके पास एक सुरक्षित संचार चैनल है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.