2014-09-26 14 views
5

NodeJS और क्रिप्टो का उपयोग करना, अभी, जब में एक उपयोगकर्ता के लॉग, मैं एक यादृच्छिक प्रमाणीकरण टोकन उत्पन्न:एक NodeJS, क्रिप्टो टोकन प्रमाणीकरण वातावरण में अद्वितीय टोकन जनरेट कर रहा है

var token = crypto.randomBytes(16).toString('hex'); 

मैं जानता हूँ कि यह संभव नहीं दिखता है, लेकिन वहाँ है एक ही मूल्य के दो टोकन के लिए एक बहुत ही छोटा मौका।

यह माप किसी उपयोगकर्ता को सिद्धांत में प्रमाणित कर सकता है।

  • जब मैं टोकन बनाएं, उन डेटाबेस क्वेरी और देखें कि क्या एक ही मूल्य के साथ एक टोकन पहले से मौजूद है:

    अब, मैं प्राप्त इस पारित करने के लिए दो स्पष्ट विधि देखें। यदि ऐसा होता है, तो बस उत्पन्न करें। जैसा कि आप देख सकते हैं, यह सही नहीं है क्योंकि मैं डेटाबेस में क्वेरी जोड़ रहा हूं।

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

आप यह कैसे करेंगे?

उत्तर

8

मौका से होने वाली चिंता के बारे में चिंता करने की संभावना बहुत कम है। मैं लॉक करने के लिए प्रदर्शन को त्याग नहीं दूंगा और इसके लिए डेटाबेस की जांच करूंगा।

20-बाइट SHA1 रकम के बीच टकराव की संभावना को के बारे में Pro Git से इस अंश पर विचार करें:

यहाँ आप क्या यह एक SHA1 टक्कर पाने के लिए ले जाएगा की एक विचार देने के लिए एक उदाहरण है। यदि पृथ्वी पर सभी 6.5 बिलियन इंसान प्रोग्रामिंग कर रहे थे, और हर सेकेंड, प्रत्येक व्यक्ति कोड का उत्पादन कर रहा था जो पूरे लिनक्स कर्नेल इतिहास (1 मिलियन गिट ऑब्जेक्ट्स) के समतुल्य था और को एक विशाल गिट भंडार में डाल रहा था, यह ले जाएगा 5 साल तक भंडार में एकल SHA-1 ऑब्जेक्ट टकराव की 50% संभावना होने के लिए पर्याप्त ऑब्जेक्ट्स शामिल हैं। एक उच्च संभावना [औसत परियोजनाओं के लिए] मौजूद है कि आपकी प्रोग्रामिंग टीम के प्रत्येक सदस्य पर उसी रात असंबद्ध घटनाओं में भेड़िये द्वारा हमला किया जाएगा और मारा जाएगा।

आप अभी भी है कि संभावना के बारे में चिंतित हैं, तो आप 16

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

+0

तुम बस मुझे एक और विचार दिया ... जब में उपयोगकर्ता के लॉग, मैं जिसके लिए उपयोगकर्ता है कि कुछ टोकन है खोज करेंगे .. क्वेरी अगर एक और परिणाम मिलते हैं, बस उपयोगकर्ता को फिर से लॉग इन करें - इस तरह से मैं सबसे खराब परिदृश्य को भी संभाल सकता हूं - आपको क्या लगता है? –

+1

आपके सर्वर को यादृच्छिक रूप से दो उपयोगकर्ताओं के बीच टोकन में टकराव उत्पन्न करने का मौका एक प्रेरित दुर्भावनापूर्ण उपयोगकर्ता के किसी अन्य उपयोगकर्ता के टोकन का अनुमान लगाने से बहुत कम है। यदि आप मानते हैं कि पहला मामला संभावित समस्या है, तो आपको दूसरे मामले पर अधिक समस्या होने और अधिक यादृच्छिक बाइट्स का उपयोग करके इसे संबोधित करना चाहिए। यदि आप मानते हैं कि 16 बाइट्स एक लक्षित ब्रूट-फोर्स हमलावर को लक्षित उपयोगकर्ता के टोकन का अनुमान लगाने से रोकने के लिए पर्याप्त है, तो उसे यह मानना ​​चाहिए कि 16 बाइट्स आपके सर्वर को टकराव उत्पन्न करने से रोकने के लिए पर्याप्त हैं। – AgentME

+0

सामान्य रूप से क्रिप्टो – hauron

0

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

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

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

संबंधित मुद्दे