प्रश्न: क्या यह एपीआई प्रमाणीकरण तकनीक आसानी से हैकबल है?एपीआई प्रमाणीकरण डिजाइन और हैकबिलिटी
apiKey = "123456789"
apiCallId = "1256341451"
apiSecret = "67d48e91ab2b7471d4be2a8c2e007d13"
sig = md5(apiKey + apiCallId + apiSecret) = 09c297a354219f173bfc49c2e203ce03
जहां
apiKey
: एक अनूठा पूर्णांक है कि मूल्य में वृद्धि हो रही किया जाना चाहिए (उदाहरण के लिए यूनिक्स समय स्टाम्प)apiSecret
: उपयोगकर्ताapiCallId
के लिए कुछ अद्वितीय पहचानकर्ता स्ट्रिंग केवल ज्ञात उपयोगकर्ता के लिए, और हमें - यूआरएलsig
में पारित नहीं किया गया: इस API कॉल के "अनावश्यक" हस्ताक्षर - MD5 हैश
उदाहरण API कॉल:
http://api.domain.com/?apiKey=123456789&apiCallId=1256341451&sig=09c297a354219f173bfc49c2e203ce03¶m1=x¶m2=y
यह API एक सत्र की आवश्यकता नहीं है, और नहीं बनाया गया है एक 3 पार्टी एक उपयोगकर्ता की ओर से उपयोग करने के लिए। इसके बजाए, इसका उपयोग उपयोगकर्ता द्वारा स्वयं किया जाना है।
मुझे वास्तव में इसकी सादगी पसंद है। apiCallId
की अनूठी होने की आवश्यकता है, और हमेशा बढ़ने का मतलब है sig
का पुन: उपयोग करना संभव नहीं है, इसलिए मुझे लगता है कि यह सुरक्षित है (रीप्ले हमलों के खिलाफ संरक्षित), लेकिन मैं एक विशेषज्ञ नहीं हूं।
अन्य एपीआई sig
की गणना करते समय वर्णानुक्रमित क्रमबद्ध सभी जीईटी पैरामीटर का उपयोग करते हैं, लेकिन मुझे नहीं लगता कि apiCallId
सहित यह क्यों आवश्यक है।
कृपया इसे लागू करने और रिलीज़ होने से पहले इसे आजमाएं और हैक करें।
मैं किसी भी प्रतिक्रिया, सुझाव और सुरक्षा शिक्षा का स्वागत करता हूं।
बहुत बढ़िया जवाब, और मुझे तकनीकी विवरण पसंद है। 'एरिक्सन' ने बताया कि उपरोक्त के साथ अवरोध (मैन-इन-द-बीच) संभव है। क्या आपके पास इस प्रकार के हमले को रोकने के लिए कोई सिफारिश है? मुझे लगता है कि यह मूल प्रश्न से परे चला जाता है। क्या HTTPS (और HTTP नहीं) का उपयोग करना इसे कवर करता है? –
मैक सभी डेटा को शामिल किया गया है, तो _and_ वहाँ जो मैक (यह महत्वपूर्ण है, के रूप में अमेज़न सीखा) के लिए एक ही इनपुट करने के लिए canonicalizes इनपुट का कोई दूसरा सेट है, और आप यह सुनिश्चित वहाँ पुनरावृत्ति हमलों अपने काउंटर करने के लिए (कोई रास्ता नहीं है योजना, ठीक से लागू, ठीक लगता है), और आपका मैक सुरक्षित है, तो आपको एमआईटीएम के खिलाफ सुरक्षित होना चाहिए। ऐसा इसलिए है क्योंकि किसी हमलावर के पास कोई विकल्प नहीं है - वे एक param या API मान को संशोधित कर सकते हैं और इसे भेजने का प्रयास कर सकते हैं, लेकिन उनके लिए सही मैक मान उत्पन्न करने का कोई तरीका नहीं होगा, इसलिए कॉल (होना चाहिए) अस्वीकार कर दिया जाना चाहिए। –
मुझे लगता है कि आप कॉल आईडी को लागू करते हैं, हमेशा डेटाबेस तालिका द्वारा बढ़ रहा है। केवल वैध मैक स्वीकार करने पर इसे अपडेट करने के लिए सावधान रहें। अन्यथा कोई यादृच्छिक हमलावर apiKey = your_id और apiCallId = 9999999999999999 ... और एक कचरा मैक मान भेज सकता है और सेवा का आसान अस्वीकार कर सकता है। HTTPS पर: आप इसका इस्तेमाल कर सकते हैं, ऐसा करने के - एक बात के लिए, यह एपीआई आदानों (और RPC प्रतिक्रियाएं) की गोपनीयता की रक्षा करेगा, और सिर्फ आम तौर पर अपने प्रमाणन योजना पर होने वाले हमलों बहुत कठिन बनाते हैं। –