एपीआई कुंजी और गुप्त का उपयोग क्यों करें?


93

मुझे कई एपीआई मिले जो उपयोगकर्ता को एपीआई कुंजी और एक गुप्त दोनों देते हैं । लेकिन मेरा सवाल यह है कि दोनों में क्या अंतर है?

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

तो दो कुंजियों का उपयोग क्यों करें?

संपादित करें: या क्या एपीआई कुंजी का उपयोग एपीआई रहस्य को देखने के लिए किया जाता है?


जवाबों:


45

गुप्त कुंजी क्रिप्टोग्राफी सांकेतिक शब्दों में बदलना करने के लिए उसी कुंजी का उपयोग करने पर निर्भर करती है और फिर बाद में एक संदेश को डिकोड करती है। इस प्रकार, केवल "गुप्त" जानने वाले ही संदेश पढ़ सकते हैं।

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

इस प्रकार, अगर मैं आपको एक संदेश भेजना चाहता हूं जिसे केवल आप पढ़ सकते हैं, तो मुझे आपकी (नेटवर्क से) सार्वजनिक कुंजी मिल जाएगी, उस कुंजी के साथ संदेश को एन्क्रिप्ट करें और आप एकमात्र व्यक्ति हैं जो इसे डिक्रिप्ट कर सकते हैं।

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

एन्क्रिप्शन का यह रूप काफी कंप्यूटर गहन है, इसलिए कभी-कभी क्या किया जाता है RSA तकनीक के साथ एक बार "गुप्त कुंजी" को एन्क्रिप्ट करने के लिए, फिर गुप्त कुंजी के साथ शेष संदेश को एन्क्रिप्ट करें, फिर दूसरे फैशन में मेरे हस्ताक्षर को एन्क्रिप्ट करें। आप इस प्रक्रिया को उल्टा कर देते हैं, यदि संदेश और हस्ताक्षर पठनीय हैं, तो आप और केवल आप इसे पढ़ सकते हैं और आपको सुनिश्चित किया जाता है कि मैंने संदेश भेज दिया है।

या

आप अधिक विस्तृत विवरण के लिए इस लिंक पर जा सकते हैं।

एपीआई कीज़ और सीक्रेट कीज़ कैसे काम करते हैं?


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

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

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

दूसरे उपयोग के मामले में आप क्रिप्टोग्राफिक हैशिंग का उपयोग करते हैं। आपके पास facebook तक बातचीत शुरू करने के लिए वास्तविक access_token होने के बाद आप अपने ऐप को प्रतिरूपण से रोकने के लिए अतिरिक्त सुरक्षा चाहते हैं। फेसबुक ऐप कंसोल में आप एक ऐसी सुविधा को चालू कर सकते हैं जिसमें एक्सेस के अलावा अपने हस्ताक्षर को शामिल करने के लिए आपके ऐप से हर फेसबुक एपी अनुरोध की आवश्यकता होती है। मैं बस उनके इरादों का अनुमान लगा रहा हूं, लेकिन मुझे लगता है कि इस बिंदु पर वे नहीं चाहते कि आप बार-बार app_secret को हर अनुरोध के साथ हस्ताक्षर के रूप में भेजें। जितना अधिक आप इसे भेजते हैं app_secret की संभावना अधिक होती है।
रयान थॉमस

1
मुझे लगता है कि जब से आपने इस अतिरिक्त सुरक्षा सुविधा का विकल्प चुना है, आपने फेसबुक के अतिरिक्त प्रदर्शन को अपने अंत में क्रिप्टोग्राफ़िक हैश कॉल के साथ सत्यापित करने की अनुमति देने के लिए एक प्रकार का निर्णय लिया है। वैसे भी इस परिदृश्य में आप अपने फेसबुक एपीआई अनुरोधों के साथ दो मान पास करते हैं। Access_token और appecret_proof नाम का एक मान जो आपके हस्ताक्षर के रूप में कार्य करता है। ऐप सीक्रेट प्रूफ, पहुंच के क्रिप्टोग्राफ़िक हैशिंग द्वारा कुंजी के रूप में app_secret का उपयोग करके बनाया गया है।
रयान थॉमस

55

आपको दो अलग-अलग कुंजियों की आवश्यकता होती है, एक जो उन्हें बताती है कि आप कौन हैं, और दूसरा जो आपको साबित करता है कि आप हैं जो आप कहते हैं कि आप हैं

"कुंजी" आपकी उपयोगकर्ता आईडी है, और "गुप्त" आपका पासवर्ड है। वे सिर्फ "कुंजी" और "गुप्त" शब्दों का उपयोग करते हैं, क्योंकि उन्होंने इसे लागू किया है।


1
और क्या होगा यदि u https पर संचार कर रहे हैं? फिर कुछ गुप्त कुंजी के साथ अपने संदेश को एन्क्रिप्ट करने का क्या मतलब है?
kamuniaft

6
जोखिम को कम करने के लिए हमेशा बिंदु होता है। यदि https संचार से समझौता किया जाता है, तो एक हमलावर जो आपके अनुरोध को पढ़ सकता है, वह नए लोगों को बनाने में सक्षम नहीं होगा। यदि आपका API बिल्लियों की तस्वीरों को रैंक करने वाला है, तो कोई बड़ी बात नहीं है, अगर यह एक भुगतान एपीआई है जो आपके पास सुरक्षा की कई परतें हैं :)
Yall

मुझे लगता है कि इसका उद्देश्य दो अलग-अलग कुंजियाँ हैं, ऐसा इसलिए है क्योंकि किसी एकल क्लाइंट ऐप के विभिन्न उपयोगकर्ताओं के अलग-अलग रहस्य हो सकते हैं, अन्यथा यदि वे सभी एक ही रहस्य रखते हैं तो एक कुंजी का होना उपयोगी नहीं है। सही?
Honey

ये API उसके लिए Bearer:प्रमाणीकरण का उपयोग क्यों नहीं करते ? आपके पास एक आईडी और एक पीडब्ल्यूडी होगा।
स्टीफन हैबर

7

सरल उत्तर, अगर मैंने इसे सही ढंग से समझा ...

यदि आप एन्क्रिप्शन के लिए अपनी एपीआई कुंजी का उपयोग करते हैं, तो सेवा को कैसे पता चलेगा कि कौन उनसे संपर्क कर रहा है? वे उस संदेश को कैसे डिक्रिप्ट करेंगे?

आप एपीआई कुंजी का उपयोग यह बताने के लिए करते हैं कि आप कौन हैं, यह वही है जो आप सादे पाठ में भेज रहे हैं। SECRET कुंजी जिसे आप किसी को नहीं भेजते हैं । आप बस इसे एन्क्रिप्शन के लिए उपयोग करते हैं। फिर आप एन्क्रिप्टेड संदेश भेजें। आप उस कुंजी को नहीं भेजते हैं जिसका उपयोग एन्क्रिप्शन के लिए किया गया था, जो उद्देश्य को हरा देगा।


तुम करो। आप एपीआई कुंजी को सर्वर पर भेजें। तो, इसका मतलब है कि आप उस मूल्य को दे रहे हैं जो सर्वर के साथ आपके संचार को रोक सकता है।
एनाजिक

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

मैंने कभी secretसादे पाठ में भेजते नहीं देखा । क्या आप मुझे लिंक दे सकते हैं? मैंने जो देखा वह secretकुछ डेटा को एन्क्रिप्ट करने के लिए उपयोग कर रहा है । और एन्क्रिप्टेड डेटा के साथ, भेजना apiKeyताकि सर्वर जानता है कि डेटा को कैसे डिक्रिप्ट किया जाए।
एनाजिक

twilio.com/docs/sms/tutorials/… और nexmo.github.io/Quickstarts/sms/send मेरे द्वारा देखे गए उदाहरण हैं जिन्होंने मुझे StackOverflow पर खोज करने के लिए प्रेरित किया।
सूडो

ट्विलियो इन शब्दों का बिल्कुल उपयोग नहीं कर रहा है। लेकिन Nexmo यकीन है कि एक नज़र के बाद, ऐसा लगता है वे सिर्फ डेटा बुला रहे हैं की तरह है ... लेकिन, secretऔर apiKeyऔर क्या वे वास्तव में क्या कर रही है usernameऔर password। जो पूरी तरह से अलग बात है ...
अंजिकिक ११'१

3

रहस्य और (सार्वजनिक) कुंजी क्या है, यह बताने वाले उत्तर हैं। यह एक सार्वजनिक-निजी कुंजी जोड़ी है जिसे वे भ्रमित करने वाले नाम देते हैं। लेकिन कोई नहीं कहता है कि एपीआई को दोनों की आवश्यकता क्यों है, और कई एपीआई आपको केवल एक रहस्य देते हैं! मैंने कभी भी किसी एपीआई के डॉक्स की व्याख्या नहीं की है कि उनके पास दो कुंजी क्यों हैं, इसलिए मैं जो सबसे अच्छा कर सकता हूं वह है अटकलें ...

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

लेकिन कई - वास्तव में यह सबसे अधिक लगता है - एपीआई आपके पास अनुरोधों में दोनों चाबियाँ भेजते हैं क्योंकि लोगों को अपने स्वयं के हस्ताक्षर करने की तुलना में आसान है; अन्यथा शुद्ध cURL उदाहरण नहीं हो सकते हैं! उस स्थिति में, उनका अलग होना व्यर्थ है। मुझे लगता है कि अलग-अलग कुंजियाँ सिर्फ उसी स्थिति में होती हैं जब वे एपीआई का उपयोग करके बाद में उनका लाभ उठाते हैं। या कुछ के पास एक ग्राहक पुस्तकालय है जो इसे अधिक सुरक्षित तरीके से कर सकता है।


0

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

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

जानकारी का एक दूसरा टुकड़ा, या "गुप्त" होने से, आप पहले "कुंजी" का उपयोग करके उपयोगकर्ता या क्रेडेंशियल को देख सकते हैं, जो किसी समय के हमले के लिए असुरक्षित हो सकता है, फिर समय-सुरक्षित तुलना फ़ंक्शन का उपयोग करके मान का मान जांचें रहस्य"।

यहाँ पायथन के उस कार्य को लागू करना है:

https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727

और यह परिवाद में उजागर किया गया है hmac(और शायद अन्य):

https://docs.python.org/3/library/hmac.html#hmac.compare_digest


यहां एक बात ध्यान देने वाली है कि मुझे नहीं लगता कि इस तरह का हमला उन मूल्यों पर काम करेगा जो देखने से पहले हैशेड या एन्क्रिप्ट किए गए हैं, क्योंकि जिन मूल्यों की तुलना की जा रही है, उनमें हर बार इनपुट स्ट्रिंग परिवर्तनों में एक चरित्र के बेतरतीब ढंग से बदलाव होते हैं। मुझे यहाँ इसकी अच्छी व्याख्या मिली ।

तब एपीआई कुंजियाँ संग्रहीत करने के लिए समाधान होंगे:

  1. एक अलग कुंजी और रहस्य का उपयोग करें, रिकॉर्ड देखने के लिए कुंजी का उपयोग करें, और गुप्त की जांच करने के लिए एक समय-सुरक्षित तुलना का उपयोग करें। यह आपको उपयोगकर्ता को फिर से एक उपयोगकर्ता को कुंजी और रहस्य दिखाने की अनुमति देता है।
  2. एक अलग कुंजी और रहस्य का उपयोग करें, गुप्त पर सममित, नियतात्मक एन्क्रिप्शन का उपयोग करें, और एन्क्रिप्टेड रहस्यों की एक सामान्य तुलना करें। यह आपको उपयोगकर्ता को फिर से कुंजी और गुप्त दिखाने की अनुमति देता है, और आपको समय-सुरक्षित तुलना को लागू करने से बचा सकता है।
  3. एक अलग कुंजी और रहस्य का उपयोग करें, रहस्य प्रदर्शित करें, हैश करें और इसे स्टोर करें, फिर हैशेड रहस्य की एक सामान्य तुलना करें। यह दो-तरफ़ा एन्क्रिप्शन का उपयोग करने की आवश्यकता को हटाता है, और सिस्टम से समझौता होने पर अपने गुप्त को सुरक्षित रखने का अतिरिक्त लाभ है। इसका नकारात्मक पक्ष यह है कि आप उपयोगकर्ता को फिर से रहस्य नहीं दिखा सकते हैं।
  4. एकल कुंजी का उपयोग करें , इसे उपयोगकर्ता को एक बार दिखाएं, हैश करें, फिर हैशेड या एन्क्रिप्ट की गई कुंजी की सामान्य खोज करें। यह एक कुंजी का उपयोग करता है, लेकिन यह फिर से उपयोगकर्ता को दिखाने में सक्षम नहीं है। यदि सिस्टम से छेड़छाड़ की जाती है, तो कुंजी को सुरक्षित रखने का लाभ है।
  5. एकल कुंजी का उपयोग करें , इसे एक बार उपयोगकर्ता को दिखाएं, इसे एन्क्रिप्ट करें, और एन्क्रिप्ट किए गए रहस्य की सामान्य खोज करें। उपयोगकर्ता को फिर से दिखाया जा सकता है, लेकिन अगर वे सिस्टम से समझौता करते हैं, तो चाबियाँ कमजोर होने की कीमत पर।

इनमें से, मुझे लगता है कि 3 सुरक्षा और सुविधा का सबसे अच्छा संतुलन है। मैंने इसे कई वेबसाइटों पर लागू किया है जब कुंजियाँ जारी की जा रही हैं।

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

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