2010-03-29 11 views
6

मैं अपना खुद का सत्र नियंत्रक लिख रहा हूं जो एक बार लॉग इन करने के लिए एक अद्वितीय आईडी जारी करता है, और तब प्रत्येक पृष्ठ लोड पर उस अद्वितीय आईडी को सत्यापित और प्रमाणित करता है। ऐसी आईडी उत्पन्न करने का सबसे सुरक्षित तरीका क्या है? क्या अद्वितीय आईडी पूरी तरह यादृच्छिक होनी चाहिए? क्या अद्वितीय आईडी के हिस्से के रूप में उपयोगकर्ता आईडी को शामिल करने का कोई नकारात्मक पक्ष है?कुकी के लिए यादृच्छिक सत्र आईडी उत्पन्न करने का सबसे सुरक्षित तरीका?

+1

अद्वितीय आईडी के हिस्से के रूप में उपयोगकर्ता आईडी का उपयोग पूरे 'यादृच्छिक' चीज़ से दूर ले जाता है। भले ही यह सार्वजनिक न हो, फिर भी वही उपयोगकर्ताओं को दी जाने वाली अधिक सुसंगत संख्याएं होंगी, जो कम सुरक्षित हैं। –

उत्तर

4

यदि कुकी में केवल एक ही जानकारी है एक पहचानकर्ता, अनिवार्य रूप से एक लेबल, एकमात्र हमला जिसे आप से बचाने की कोशिश कर रहे हैं वह हमलावर है जो अनुमान लगा रहा है। तो कुछ यादृच्छिक बाइट्स का उपयोग करें। पर्याप्त यादृच्छिक बाइट्स कि यह "अप्रत्याशित" है।

फिर यादृच्छिक बाइट्स को उस चीज में फिसल दें जो कि आप कितने अक्षरों को HTTP कुकी में उपयोग कर सकते हैं। बेस 64 इस के लिए काम करता है। यह बिल्कुल इष्टतम नहीं है, क्योंकि 64 से अधिक कुकी-सुरक्षित वर्ण हैं और यह == वर्णों को पीछे छोड़ने के लिए जाता है जो हेडर पर बाइट जोड़ते हैं लेकिन यादृच्छिकता नहीं, लेकिन यह ठीक है। यह काम करता है और पाइथन संभवतः बेस 64 एन्कोडिंग को किसी और चीज से तेज कर सकता है जिसके साथ हम आ सकते हैं।

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

+3

100% निश्चित करें कि कुकी * कभी * सादे HTTP पर नहीं जाती है; अगर इसे अवरुद्ध किया जा सकता है, तो "अप्रसन्न" अब एक कारक नहीं है। फिर, मैं विषय पर कुछ वास्तविक पढ़ने की सलाह देते हैं ... – retracile

+1

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

-1

सबसे अच्छा तरीका है generate a UUID होगा, uuid.uuid1 फ़ंक्शन का उपयोग:

एक मेजबान आईडी, क्रम संख्या, और वर्तमान समय से एक UUID उत्पन्न करें।

+0

क्या यह मशीन की मेजबान आईडी होगी जिस पर स्क्रिप्ट चल रही है? या कनेक्टिंग उपयोगकर्ता का? मेजबान आईडी कैसे निर्दिष्ट किया जाता है? धन्यवाद। – ensnare

+3

निरंतर कारक (जैसे होस्ट आईडी) या अनुमानित कारक (अनुक्रम संख्या की तरह) होने के कारण आप इस एप्लिकेशन के लिए जो चाहते हैं वह नहीं है। कार्यान्वयन के आधार पर uuid.uuid4 अधिक उपयुक्त हो सकता है। इसके अलावा, यूयूआईडी हेक्साडेसिमल में व्यक्त एक स्ट्रिंग है, और यदि आप वर्णों की विस्तृत श्रृंखला का उपयोग करते हैं तो आप अधिक एन्ट्रॉपी-प्रति-बाइट कर सकते हैं। – keturn

4

2.512 और उच्चतर में UUID मॉड्यूल का उपयोग करें। इस तरह वे अनुमान लगाया नहीं जा सकता क्योंकि वे अनुक्रमिक नहीं हैं। यदि आप उन्हें वास्तव में सुरक्षित रखना चाहते हैं तो आप उन्हें उपयोगकर्ता की आईडी के साथ नमक कर सकते हैं और फिर SHA1 हैश उन्हें, Base64 परिणाम एन्कोड कर सकते हैं और फिर उस मान के रूप में उपयोग कर सकते हैं। इस तरह आप सर्वर की तरफ से सत्यापित कर सकते हैं कि वे वास्तव में आपकी कुकीज़ हैं और कुछ ऐसा नहीं जो कुछ स्पैमर उत्पन्न कर रहा है और आपके सर्वर पर फेंक रहा है। और उन्हें और भी सुरक्षित बनाने के लिए सुनिश्चित करें कि वे केवल सर्वर के साथ-साथ क्लाइंट पर निश्चित समय के लिए बने रहें। पायथन 2.6.5 में HMAC अंतर्निहित निर्माण है जिसमें आप जेनरेट किए गए यूयूआईडी पर भी उपयोग कर सकते हैं।

+0

हैश के इस सर्वर-साइड सत्यापन को आप कैसे करते हैं? और वह आपको फिर से खरीदता है? यह कुछ यादृच्छिक बाइट्स के साथ आने के लिए एक भ्रामक जटिल तरीका लगता है। – keturn

+3

एचएमएसी का उपयोग करने से सर्वर को यह सत्यापित करने की अनुमति मिलती है कि यह उस यादृच्छिक मान को संग्रहीत किए बिना यादृच्छिक मान उत्पन्न करता है। इसमें टोकन की समाप्ति की अनुमति देने के लिए टाइमस्टैम्प भी शामिल हो सकता है, और क्लाइंट उस टाइमस्टैम्प को एचएमएसी को अमान्य किए बिना संशोधित नहीं कर सकता है। यह * अधिक जटिल है, लेकिन आपको डेटाबेस को मारने के बिना उस टोकन को सत्यापित करने की अनुमति देता है। – retracile

+2

मुझे शायद यह भी उल्लेख करना चाहिए कि एचएमएसी मामले में, यादृच्छिक मूल्य केवल एक गैर-होना चाहिए। लेकिन किताबें यही हैं - वे इसे जितना संभव हो उतना बेहतर कवर कर सकते हैं। :) – retracile

7

जाओ ब्रूस श्नीयर के Secrets and Lies और उसके Practical Cryptography खरीदें। आगे बढ़ें और रॉस एंडरसन के Security Engineering 2nd Ed. पर ऑर्डर करें जब आप इसमें हों। अब, रहस्य और झूठ पढ़ें - मेरा विश्वास करो, यह एक मजेदार पढ़ा है। :) फिर प्रैक्टिकल क्रिप्टोग्राफी पढ़ें। उस बिंदु पर आपको कुछ सुरक्षा की आवश्यकता वाले सॉफ़्टवेयर को लागू करते समय आपको क्या करना होगा, उसमें बेहतर ग्राउंडिंग होना चाहिए। आगे बढ़ें और अपने मोटे ड्राफ्ट कार्यान्वयन करें। अब जब सुरक्षा इंजीनियरिंग की आपकी प्रति आ गई है, इसे पढ़ें ... हालांकि वह एक आप थोड़ा धीमा करना पड़ेगा; यह एक बल्कि भारी टोम है।

एक whitepaper on web authentication dos and don'ts भी है जो पढ़ने योग्य है और आप जो भी कर रहे हैं उसके लिए थोड़ा अधिक सीधे लागू होते हैं। मैं अभी भी ऊपर की किताबों की सिफारिश करता हूं।

और another timely article from LWN.net जो आपको बचाने के लिए काम करने की ज़रूरतों की एक बड़ी संख्या सूचीबद्ध करता है। (बीटीडब्ल्यू, LWN.net सब्सक्राइब करने के लायक है, और मैं अत्यधिक अनुशंसा करता हूं। उपर्युक्त लिंक उस आलेख तक मुफ्त पहुंच की अनुमति देता है जो अन्यथा गैर-ग्राहकों के लिए उपलब्ध नहीं होगा।)

4

आप os.urandom उपयोग कर सकते हैं:

os.urandom (एन)

वापसी क्रिप्टोग्राफिक उपयोग के लिए उपयुक्त n यादृच्छिक बाइट्स के एक स्ट्रिंग।

यह फ़ंक्शन एक ओएस-विशिष्ट यादृच्छिकता स्रोत से यादृच्छिक बाइट्स देता है। लौटाया गया डेटा क्रिप्टोग्राफिक अनुप्रयोगों के लिए पर्याप्त अप्रत्याशित होना चाहिए, हालांकि इसकी सटीक गुणवत्ता ओएस कार्यान्वयन पर निर्भर करती है। यूनिक्स जैसी प्रणाली पर यह क्वेरी/dev/urandom, और Windows पर CryptGenRandom का उपयोग करेगा। यदि एक यादृच्छिकता स्रोत नहीं मिला है, तो NotImplementedError उठाया जाएगा।

संस्करण 2.4 में नया।

+1

ध्यान दें कि यह यादृच्छिक 'बाइट्स 'देता है, वर्ण नहीं। आप शायद [base64.b64encode] (https://docs.python.org/3/library/base64.html#base64.b64encode) के परिणाम को चलाने के लिए चाहते हैं और इसे सत्र आईडी के रूप में उपयोग करें। – WhyNotHugo

0

http://docs.python.org/2/library/random.html

"चेतावनी: इस [यादृच्छिक] मॉड्यूल के छद्म यादृच्छिक जनरेटर सुरक्षा उद्देश्यों के लिए नहीं किया जाना चाहिए os.urandom() या SystemRandom प्रयोग करें यदि आप एक क्रिप्टोग्राफी द्वारा सुरक्षित छद्म यादृच्छिक आवश्यकता होती है। संख्या जनरेटर। "

"os.urandom फ़ंक्शन एक ओएस-विशिष्ट यादृच्छिक स्रोत से यादृच्छिक बाइट्स लौटाता है। लौटाया गया डेटा क्रिप्टोग्राफिक अनुप्रयोगों के लिए पर्याप्त अप्रत्याशित होना चाहिए, हालांकि इसकी सटीक गुणवत्ता ओएस कार्यान्वयन पर निर्भर करती है। यूनिक्स जैसी प्रणाली पर यह क्वेरी होगी/dev/urandom, और Windows पर यह CryptGenRandom() का उपयोग करेगा। यदि कोई यादृच्छिकता स्रोत नहीं मिला है, तो NotImplementedError उठाया जाएगा।

आपके प्लेटफॉर्म द्वारा प्रदान किए गए यादृच्छिक संख्या जनरेटर के लिए उपयोग में आसान इंटरफ़ेस के लिए, कृपया यादृच्छिक देखें। सिस्टम रैंडम। "

0

मैं यादृच्छिक कारक से पूरी तरह से बचूंगा। क्या मैं आम तौर पर किया है है:

  • उत्पन्न एक अनुक्रमिक session_id (जो मैं स्थानीय रूप से संग्रहीत)।
  • जब उपयोगकर्ता लॉग इन करता है, तो session_id पर एक निजी कुंजी के साथ साइन इन करें (मैं इसके लिए itsdangerous का उपयोग करता हूं)।
  • जब मुझे कोई अनुरोध मिलता है, तो session_id का हस्ताक्षर बरकरार है, तो मैं आगे बढ़ता हूं, अन्यथा, 403 (400 भी समझ में आता है)।

ध्यान दें कि मैं स्थानीय रूप से session_id स्टोर करता हूं क्योंकि मैं समय-समय पर अंतिम सत्र समाप्त करने में सक्षम होना चाहता हूं।

यदि आपके सत्र हमेशा एक निश्चित समय तक चलते हैं, और आपको उन्हें समय-समय पर समाप्त करने की आवश्यकता नहीं है, तो आप बस user_id + datetime.now() पर हस्ताक्षर कर सकते हैं। यह पूरी तरह से स्टेटलेस सत्र प्रबंधन की अनुमति देता है।

1

यदि आप पायथन 3.6+ का उपयोग कर रहे हैं, तो आप नई लाइब्रेरी secrets का उपयोग कर सकते हैं।

from secrets import token_urlsafe 

token = token_urlsafe(64) # something like Drmhze6EPcv0fN_81Bj-nA.... 
संबंधित मुद्दे