मैं अपना खुद का सत्र नियंत्रक लिख रहा हूं जो एक बार लॉग इन करने के लिए एक अद्वितीय आईडी जारी करता है, और तब प्रत्येक पृष्ठ लोड पर उस अद्वितीय आईडी को सत्यापित और प्रमाणित करता है। ऐसी आईडी उत्पन्न करने का सबसे सुरक्षित तरीका क्या है? क्या अद्वितीय आईडी पूरी तरह यादृच्छिक होनी चाहिए? क्या अद्वितीय आईडी के हिस्से के रूप में उपयोगकर्ता आईडी को शामिल करने का कोई नकारात्मक पक्ष है?कुकी के लिए यादृच्छिक सत्र आईडी उत्पन्न करने का सबसे सुरक्षित तरीका?
उत्तर
यदि कुकी में केवल एक ही जानकारी है एक पहचानकर्ता, अनिवार्य रूप से एक लेबल, एकमात्र हमला जिसे आप से बचाने की कोशिश कर रहे हैं वह हमलावर है जो अनुमान लगा रहा है। तो कुछ यादृच्छिक बाइट्स का उपयोग करें। पर्याप्त यादृच्छिक बाइट्स कि यह "अप्रत्याशित" है।
फिर यादृच्छिक बाइट्स को उस चीज में फिसल दें जो कि आप कितने अक्षरों को HTTP कुकी में उपयोग कर सकते हैं। बेस 64 इस के लिए काम करता है। यह बिल्कुल इष्टतम नहीं है, क्योंकि 64 से अधिक कुकी-सुरक्षित वर्ण हैं और यह ==
वर्णों को पीछे छोड़ने के लिए जाता है जो हेडर पर बाइट जोड़ते हैं लेकिन यादृच्छिकता नहीं, लेकिन यह ठीक है। यह काम करता है और पाइथन संभवतः बेस 64 एन्कोडिंग को किसी और चीज से तेज कर सकता है जिसके साथ हम आ सकते हैं।
यदि आप उपयोगकर्ता आईडी को भी प्रीपेड करना चाहते हैं, तो इससे चीजों को ट्रेस और डीबग करना आसान हो जाएगा, जो संभवतः आपके जीवन को आसान बना देगा, इसलिए आगे बढ़ें। यह हमलावर को कोई महत्वपूर्ण लाभ नहीं देता है। (जब तक कि वे अन्यथा यह निर्धारित करने में सक्षम न हों कि वे किस उपयोगकर्ता से चोरी कर रहे हैं, जो असंभव लगता है।)
100% निश्चित करें कि कुकी * कभी * सादे HTTP पर नहीं जाती है; अगर इसे अवरुद्ध किया जा सकता है, तो "अप्रसन्न" अब एक कारक नहीं है। फिर, मैं विषय पर कुछ वास्तविक पढ़ने की सलाह देते हैं ... – retracile
बड़े पैमाने पर सच है। लेकिन दुनिया का केवल एक छोटा सा हिस्सा पैकेट को अवरुद्ध करने की स्थिति में है। जबकि आप अनुमान लगाने के लिए दुनिया में कहीं भी एक संपूर्ण बोनेट का उपयोग कर सकते हैं। लेकिन, हाँ, अगर आप खराब सुरक्षित वाईफाई हॉटस्पॉट का उपयोग करके किसी को भी पेंच नहीं करना चाहते हैं, तो HTTPS और मान्य प्रमाणपत्र प्राप्त करें। हालांकि इनमें से कोई भी कुकी पीढ़ी पर कोई विशेष असर नहीं रखता है। – keturn
सबसे अच्छा तरीका है generate a UUID होगा, uuid.uuid1
फ़ंक्शन का उपयोग:
एक मेजबान आईडी, क्रम संख्या, और वर्तमान समय से एक UUID उत्पन्न करें।
क्या यह मशीन की मेजबान आईडी होगी जिस पर स्क्रिप्ट चल रही है? या कनेक्टिंग उपयोगकर्ता का? मेजबान आईडी कैसे निर्दिष्ट किया जाता है? धन्यवाद। – ensnare
निरंतर कारक (जैसे होस्ट आईडी) या अनुमानित कारक (अनुक्रम संख्या की तरह) होने के कारण आप इस एप्लिकेशन के लिए जो चाहते हैं वह नहीं है। कार्यान्वयन के आधार पर uuid.uuid4 अधिक उपयुक्त हो सकता है। इसके अलावा, यूयूआईडी हेक्साडेसिमल में व्यक्त एक स्ट्रिंग है, और यदि आप वर्णों की विस्तृत श्रृंखला का उपयोग करते हैं तो आप अधिक एन्ट्रॉपी-प्रति-बाइट कर सकते हैं। – keturn
2.512 और उच्चतर में UUID मॉड्यूल का उपयोग करें। इस तरह वे अनुमान लगाया नहीं जा सकता क्योंकि वे अनुक्रमिक नहीं हैं। यदि आप उन्हें वास्तव में सुरक्षित रखना चाहते हैं तो आप उन्हें उपयोगकर्ता की आईडी के साथ नमक कर सकते हैं और फिर SHA1 हैश उन्हें, Base64 परिणाम एन्कोड कर सकते हैं और फिर उस मान के रूप में उपयोग कर सकते हैं। इस तरह आप सर्वर की तरफ से सत्यापित कर सकते हैं कि वे वास्तव में आपकी कुकीज़ हैं और कुछ ऐसा नहीं जो कुछ स्पैमर उत्पन्न कर रहा है और आपके सर्वर पर फेंक रहा है। और उन्हें और भी सुरक्षित बनाने के लिए सुनिश्चित करें कि वे केवल सर्वर के साथ-साथ क्लाइंट पर निश्चित समय के लिए बने रहें। पायथन 2.6.5 में HMAC अंतर्निहित निर्माण है जिसमें आप जेनरेट किए गए यूयूआईडी पर भी उपयोग कर सकते हैं।
हैश के इस सर्वर-साइड सत्यापन को आप कैसे करते हैं? और वह आपको फिर से खरीदता है? यह कुछ यादृच्छिक बाइट्स के साथ आने के लिए एक भ्रामक जटिल तरीका लगता है। – keturn
एचएमएसी का उपयोग करने से सर्वर को यह सत्यापित करने की अनुमति मिलती है कि यह उस यादृच्छिक मान को संग्रहीत किए बिना यादृच्छिक मान उत्पन्न करता है। इसमें टोकन की समाप्ति की अनुमति देने के लिए टाइमस्टैम्प भी शामिल हो सकता है, और क्लाइंट उस टाइमस्टैम्प को एचएमएसी को अमान्य किए बिना संशोधित नहीं कर सकता है। यह * अधिक जटिल है, लेकिन आपको डेटाबेस को मारने के बिना उस टोकन को सत्यापित करने की अनुमति देता है। – retracile
मुझे शायद यह भी उल्लेख करना चाहिए कि एचएमएसी मामले में, यादृच्छिक मूल्य केवल एक गैर-होना चाहिए। लेकिन किताबें यही हैं - वे इसे जितना संभव हो उतना बेहतर कवर कर सकते हैं। :) – retracile
जाओ ब्रूस श्नीयर के 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 सब्सक्राइब करने के लायक है, और मैं अत्यधिक अनुशंसा करता हूं। उपर्युक्त लिंक उस आलेख तक मुफ्त पहुंच की अनुमति देता है जो अन्यथा गैर-ग्राहकों के लिए उपलब्ध नहीं होगा।)
आप os.urandom उपयोग कर सकते हैं:
os.urandom (एन)
वापसी क्रिप्टोग्राफिक उपयोग के लिए उपयुक्त n यादृच्छिक बाइट्स के एक स्ट्रिंग।
यह फ़ंक्शन एक ओएस-विशिष्ट यादृच्छिकता स्रोत से यादृच्छिक बाइट्स देता है। लौटाया गया डेटा क्रिप्टोग्राफिक अनुप्रयोगों के लिए पर्याप्त अप्रत्याशित होना चाहिए, हालांकि इसकी सटीक गुणवत्ता ओएस कार्यान्वयन पर निर्भर करती है। यूनिक्स जैसी प्रणाली पर यह क्वेरी/dev/urandom, और Windows पर CryptGenRandom का उपयोग करेगा। यदि एक यादृच्छिकता स्रोत नहीं मिला है, तो NotImplementedError उठाया जाएगा।
संस्करण 2.4 में नया।
ध्यान दें कि यह यादृच्छिक 'बाइट्स 'देता है, वर्ण नहीं। आप शायद [base64.b64encode] (https://docs.python.org/3/library/base64.html#base64.b64encode) के परिणाम को चलाने के लिए चाहते हैं और इसे सत्र आईडी के रूप में उपयोग करें। – WhyNotHugo
http://docs.python.org/2/library/random.html
"चेतावनी: इस [यादृच्छिक] मॉड्यूल के छद्म यादृच्छिक जनरेटर सुरक्षा उद्देश्यों के लिए नहीं किया जाना चाहिए os.urandom() या SystemRandom प्रयोग करें यदि आप एक क्रिप्टोग्राफी द्वारा सुरक्षित छद्म यादृच्छिक आवश्यकता होती है। संख्या जनरेटर। "
"os.urandom फ़ंक्शन एक ओएस-विशिष्ट यादृच्छिक स्रोत से यादृच्छिक बाइट्स लौटाता है। लौटाया गया डेटा क्रिप्टोग्राफिक अनुप्रयोगों के लिए पर्याप्त अप्रत्याशित होना चाहिए, हालांकि इसकी सटीक गुणवत्ता ओएस कार्यान्वयन पर निर्भर करती है। यूनिक्स जैसी प्रणाली पर यह क्वेरी होगी/dev/urandom, और Windows पर यह CryptGenRandom() का उपयोग करेगा। यदि कोई यादृच्छिकता स्रोत नहीं मिला है, तो NotImplementedError उठाया जाएगा।
आपके प्लेटफॉर्म द्वारा प्रदान किए गए यादृच्छिक संख्या जनरेटर के लिए उपयोग में आसान इंटरफ़ेस के लिए, कृपया यादृच्छिक देखें। सिस्टम रैंडम। "
मैं यादृच्छिक कारक से पूरी तरह से बचूंगा। क्या मैं आम तौर पर किया है है:
- उत्पन्न एक अनुक्रमिक
session_id
(जो मैं स्थानीय रूप से संग्रहीत)। - जब उपयोगकर्ता लॉग इन करता है, तो
session_id
पर एक निजी कुंजी के साथ साइन इन करें (मैं इसके लिएitsdangerous
का उपयोग करता हूं)। - जब मुझे कोई अनुरोध मिलता है, तो
session_id
का हस्ताक्षर बरकरार है, तो मैं आगे बढ़ता हूं, अन्यथा, 403 (400 भी समझ में आता है)।
ध्यान दें कि मैं स्थानीय रूप से session_id
स्टोर करता हूं क्योंकि मैं समय-समय पर अंतिम सत्र समाप्त करने में सक्षम होना चाहता हूं।
यदि आपके सत्र हमेशा एक निश्चित समय तक चलते हैं, और आपको उन्हें समय-समय पर समाप्त करने की आवश्यकता नहीं है, तो आप बस user_id + datetime.now()
पर हस्ताक्षर कर सकते हैं। यह पूरी तरह से स्टेटलेस सत्र प्रबंधन की अनुमति देता है।
यदि आप पायथन 3.6+ का उपयोग कर रहे हैं, तो आप नई लाइब्रेरी secrets का उपयोग कर सकते हैं।
from secrets import token_urlsafe
token = token_urlsafe(64) # something like Drmhze6EPcv0fN_81Bj-nA....
- 1. एक्सप्रेसज सुरक्षित सत्र कुकी
- 2. सुरक्षित सत्र-कुकी
- 3. एक्सप्रेस सत्र आईडी कुकी
- 4. यादृच्छिक बिट्स उत्पन्न करने का सबसे तेज़ तरीका
- 5. उपयोगकर्ता कुकी स्टोर करने के लिए पर्याप्त सत्र कुकी सुरक्षित है?
- 6. टोरनेडो सुरक्षित कुकी समाप्ति (उर्फ सुरक्षित सत्र कुकी)
- 7. स्थिर RNGCryptoServiceProvider - क्या यह सत्र और यादृच्छिक पासवर्ड उत्पन्न करने के लिए सुरक्षित और थ्रेडसेफ है?
- 8. एएसपी.Net सत्र टाइमआउट पहचान: सत्र है। नया सत्र और सत्र कुकी यह करने का सबसे अच्छा तरीका है?
- 9. सीएसआरएफ प्रमाणीकरण टोकन: सत्र आईडी सुरक्षित?
- 10. यादृच्छिक आकस्मिक तालिकाओं को उत्पन्न करने के लिए कुशल तरीका?
- 11. एक अद्वितीय डेटाबेस आईडी उत्पन्न करने के लिए System.currentTimeMillis() का उपयोग करने के लिए सुरक्षित?
- 12. PHP के भीतर एक यादृच्छिक कुंजी उत्पन्न करने का सबसे अच्छा तरीका क्या है?
- 13. सर्विसस्टैक सत्र आईडी पर्याप्त सुरक्षित हैं?
- 14. सत्र आईडी कैसे उत्पन्न होता है?
- 15. सत्र आईडी
- 16. यादृच्छिक हैश/स्ट्रिंग बनाने का सबसे अच्छा तरीका क्या है?
- 17. कुकी में सत्र आईडी एन्क्रिप्ट कैसे करें?
- 18. लाइसेंस सॉफ्टवेयर के लिए सबसे सुरक्षित तरीका
- 19. यादृच्छिक पाठ उत्पन्न करने के लिए सरणी का उपयोग
- 20. फ़ाइल अपलोड करने के लिए सबसे सुरक्षित तरीका क्या है?
- 21. पी/कोड कोड उत्पन्न करने का सबसे आसान तरीका?
- 22. पाइथन के साथ जावा उत्पन्न करने का सबसे अच्छा तरीका?
- 23. सी # में अर्ध यादृच्छिक संख्या उत्पन्न करने का सबसे आसान तरीका क्या है?
- 24. यादृच्छिक संख्या उत्पन्न करने के लिए रैंड का उपयोग
- 25. NHibernate में सत्र का प्रबंधन करने का सबसे अच्छा तरीका?
- 26. PHP सत्र या कुकी
- 27. सबसे सुरक्षित तरीका
- 28. जीडब्ल्यूटी: कुकी में सत्र आईडी संग्रहित करना, और फिर क्या?
- 29. तत्वों के यादृच्छिक क्रम उत्पन्न करने के लिए एल्गोरिदम
- 30. क्या Windows 2003 पर जेनरेट किए गए GUIDs सत्र आईडी के रूप में उपयोग करने के लिए सुरक्षित हैं?
अद्वितीय आईडी के हिस्से के रूप में उपयोगकर्ता आईडी का उपयोग पूरे 'यादृच्छिक' चीज़ से दूर ले जाता है। भले ही यह सार्वजनिक न हो, फिर भी वही उपयोगकर्ताओं को दी जाने वाली अधिक सुसंगत संख्याएं होंगी, जो कम सुरक्षित हैं। –