2011-08-05 10 views
69

के साथ पासवर्ड संग्रहीत करना मैं कुछ उदाहरणों की तलाश कर रहा हूं कि सुरक्षित रूप से पासवर्ड और अन्य संवेदनशील डेटा को node.js और mongodb का उपयोग करके कैसे सुरक्षित किया जाए।नोड.जेएस और मोंगोडीबी

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

प्रमाणीकरण के लिए मुझे केवल नमक और इनपुट एन्क्रिप्ट करना है और इसे संग्रहीत हैश से मेल करना है?

क्या मुझे कभी भी इस डेटा को डिक्रिप्ट करने की आवश्यकता है और यदि ऐसा है तो मुझे यह कैसे करना चाहिए?

निजी कुंजी, या यहां तक ​​कि सर्वर पर सुरक्षित रूप से संग्रहीत विधियां कैसे हैं?

मैंने सुना है कि एईएस और ब्लोफिश दोनों अच्छे विकल्प हैं, मुझे क्या उपयोग करना चाहिए?

इसे डिजाइन करने के तरीके के किसी भी उदाहरण आश्चर्यजनक रूप से सहायक होंगे!

धन्यवाद!

+0

([डेटाबेस में संग्रहीत पासवर्ड का पसंदीदा तरीका] के संभावित डुप्लिकेट http://stackoverflow.com/questions/615704/पसंदीदा-विधि-भंडारण-पासवर्ड-इन-डेटाबेस) – Thilo

+0

https://github.com/bnoguchi/mongoose-auth/? – Alfred

उत्तर

35

इस का उपयोग करें: https://github.com/ncb000gt/node.bcrypt.js/

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

bcrypt उपयोग करने के लिए बहुत सरल है। यहां मेरे मोंगोस उपयोगकर्ता स्कीमा (कॉफीस्क्रिप्ट में) से एक स्निपेट है। Async फ़ंक्शंस का उपयोग करना सुनिश्चित करें क्योंकि बायक्रिप्ट धीमा है (उद्देश्य पर)।

class User extends SharedUser 
    defaults: _.extend {domainId: null}, SharedUser::defaults 

    #Irrelevant bits trimmed... 

    password: (cleartext, confirm, callback) -> 
    errorInfo = new errors.InvalidData() 
    if cleartext != confirm 
     errorInfo.message = 'please type the same password twice' 
     errorInfo.errors.confirmPassword = 'must match the password' 
     return callback errorInfo 
    message = min4 cleartext 
    if message 
     errorInfo.message = message 
     errorInfo.errors.password = message 
     return callback errorInfo 
    self = this 
    bcrypt.gen_salt 10, (error, salt)-> 
     if error 
     errorInfo = new errors.InternalError error.message 
     return callback errorInfo 
     bcrypt.encrypt cleartext, salt, (error, hash)-> 
     if error 
      errorInfo = new errors.InternalError error.message 
      return callback errorInfo 
     self.attributes.bcryptedPassword = hash 
     return callback() 

    verifyPassword: (cleartext, callback) -> 
    bcrypt.compare cleartext, @attributes.bcryptedPassword, (error, result)-> 
     if error 
     return callback(new errors.InternalError(error.message)) 
     callback null, result 

इसके अलावा, this article, which should convince you that bcrypt is a good choice पढ़ सकते हैं और आप "अच्छी तरह से और सही मायने में effed" बनने से बचने में मदद।

+1

मुझे 100% यकीन नहीं है कि मैं bcrypt का उपयोग करने के तर्क में खरीदता हूं क्योंकि यह धीमा है, लेख आलेख के रूप में। ऐसा कोई कारण नहीं है कि आप SHA-256 जैसे अधिक "मानक" और व्यापक रूप से उपयोग किए गए एल्गोरिदम का उपयोग नहीं कर सकते हैं और बस अपने सिस्टम पर कृत्रिम विलंबता लगा सकते हैं। सर्वर वास्तव में हैश पास करने से पहले एक सेकंड की एक चौथाई प्रतीक्षा करें। कुछ सिस्टम उपयोगकर्ता लॉकआउट (या कम विशेषाधिकार) प्रोटोकॉल भी लगाते हैं यदि उन्हें वाई घंटे के भीतर अपना पासवर्ड गलत x बार मिलता है। यह कुछ सामान के साथ आता है, लेकिन यह विचार करने का एक विकल्प है। – d512

+18

आप बिंदु खो रहे हैं। मुद्दा यह है कि यदि कोई हमलावर पासवर्ड हैश के आपके डेटाबेस को चुरा लेता है, तो हमलावर के लिए उनके सिस्टम पर चलाने के लिए बीसीआरपीटी धीमा है, और इसके आसपास कोई रास्ता नहीं है क्योंकि कार्य कारक एल्गोरिदम में ही बनाया गया है। एसएचए -256 प्लस कृत्रिम विलंबता ए है) एक सामान्य उद्देश्य हैशिंग एल्गोरिदम और बी का उपयोग करके) चोरी किए गए पासवर्ड हैश की ऑफलाइन क्रैकिंग के खिलाफ आपको सुरक्षित नहीं करता है। –

+0

हां, एक परिदृश्य में जिसमें हमलावर वास्तव में सभी पासवर्ड हैंश की एक प्रति प्राप्त करने में सक्षम था, उन्हें बीसीआरपीटी के तहत उन्हें क्रैक करने में कठिन समय होता। आलेख विशेष रूप से इस मामले का उल्लेख नहीं करता है लेकिन शायद यह होना चाहिए। – d512